본문 바로가기

Framework/Spring

[Spring] 10. 스프링(Spring) 실습 Ⅰ

스프링 실습 Ⅰ

 

다음 구성 요소를 바탕으로 프로젝트를 구성한다.

구성 요소 파일명 내용
Model HomeVO.java 데이터 모델 클래스
View index.jsp 메인 페이지
delete.jsp 데이터 삭제 결과를 표시하는 페이지
insert.jsp 데이터 삽입 결과 를 표시하는 페이지
member.jsp 회원 정보 표시하거나 입력 받는 페이지
one.jsp 단일 데이터 항목을 표시하는 페이지
test.jsp 테스트용 페이지
Controller HomeController.java 사용자의 요청을 처리하고, 적절한 뷰로 모델 데이터 전달
MemberController.java 회원 관련 요청을 처리하고, 적절한 뷰로 모델 데이터 전달
Config AppConfig.java 애플리케이션 전반에 대한 설정 담당
WebConfig.java Spring MVC 설정을 담당하며 뷰 리졸버 설정
WebAppInitializer.java 서블릿 컨텍스트 초기화

 

 

 

Config

 

config 폴더에 있는 AppConfig, WebAppInitializer, WebConfig 파일을 설정한다.

AppConfig 애플리케이션 컨텍스트 설정, 빈 정의 관리, 데이터베이스 설정
WebAppInitializer 서블릿 컨테이너 초기화, 서블릿 매핑 및 설정, DispatcherServlet 설정
WebConfig 뷰 리졸버 설정, 정적 자원 매핑, 인터셉터 설정, 메시지 컨버터 설정

 

// WebAppInitializer.java
// 스프링 기반 웹 애플리케이션의 초기 설정을 구성하여 서블릿 컨테이너가 올바르게 동작하도록 함

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    // 루트 애플리케이션 컨텍스트에 로드할 설정 클래스 반환
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { AppConfig.class };
    }
    
    // 서블릿 애플리케이션 컨텍스트에 로드할 설정 클래스 반환
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { WebConfig.class };
    }

    // 디스패치 서블릿에 매핑할 URL 패턴을 반환
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}
// AppConfig.java

@Configuration
public class AppConfig {
}
// WebConfig.java

// Configuration : 이 클래스가 하나 이상의 스프링 빈을 정의하는데 사용
// EnableWebMvc : 스프링 MVC를 활성화하고, 기본적인 설정 적용 > ViewResolver 설정, static 파일 설정 포함
// ComponentScan : 지정된 패키지에서 컴포넌트를 스캔하여 빈으로 등록

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "org.example.spring0806")
public class WebConfig implements WebMvcConfigurer {

    // ViewResolver 빈 설정
    // controller에서 전달된 데이터를 출력할 jsp 파일 위치 
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    // resources 위치 핸들러 설정, static 파일 설정 (js, css, image 등)
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/resources/");
    }

}

 

 

 

VO

 

HomeVO 파일을 설정한다.

// HomeVO.java

// Data : Getter, Setter, equals(), toString() 메소드 자동 생성

@Data
public class HomeVO {
    private int id;
    private String name;
}

 

 

 

Controller 

 

HomeController 주요 메서드는 다음과 같다.

  URL 매핑 HTTP 메서드 파라미터 반환 타입
index / GET X String
home /test GET X String
member /member GET X String
// HomeController.java

// Controller : HomeController 클래스를 Spring MVC 컨트롤러로 지정 > HTTP 요청 처리하는 메서드 정의
// Sl4fj : log라는 이름의 Logger 객체 자동 생성 > log.info와 같은 로그 출력 가능

@Controller     
@Slf4j
public class HomeController {
    
    // GET 요청이 루트 경로(/)로 들어올 때 실행하여 index.jsp 반환
    @GetMapping("/")
    public String index() {
        log.info("HomeController index");
        return "index";
    }
    
    // GET 요청이 /test 경로로 들어올 때 실행하여 test.jsp 반환
    @GetMapping("/test")
    public String home() {
        log.info("HomeController test");
        return "test";
    }
    
    // GET 요청이 /member로 들어올 때 실행하여 member.jsp 반환
    @GetMapping("/member")
    public String member() {
        log.info("HomeController member");
        return "member";
    }
}

 

 

MemberController의 주요 메서드는 다음과 같다.

  URL 매핑 HTTP 메서드 파라미터 반환 타입
insert /insert GET X String
delete /delete GET X String
one /one POST id(int) ModelAndView
update /update GET id(int), name(String) String
// MemberController.java

// Controller : HomeController 클래스를 Spring MVC 컨트롤러로 지정 > HTTP 요청 처리하는 메서드 정의
// Sl4fj : log라는 이름의 Logger 객체 자동 생성 > log.info와 같은 로그 출력 가능

@Controller
@Slf4j
public class MemberController {
    @GetMapping("/insert")
    public String insert() {
        log.info("----- MemberController insert -----");
        return "insert";
    }

    @GetMapping("/delete")
    public String delete() {
        log.info("----- MemberController delete -----");
        return "delete";
    }

    // ModelAndView 객체에 homeVO라는 이름으로 HomeVO 객체 추가
    // 이렇게 추가된 객체는 뷰에서 사용할 수 있으며 JSP에서 homeVO라는 이름으로 참조
    @PostMapping("/one")
    public ModelAndView one(int id) {
        log.info("----- MemberController one -----");
        ModelAndView modelAndView = new ModelAndView();
        HomeVO homeVO = new HomeVO();
        homeVO.setId(id);
        homeVO.setName("hong");
        modelAndView.addObject("homeVO", homeVO);
        return modelAndView;
    }

    @GetMapping("/update")
    public String update(int id, String name) {
        log.info("----- MemberController update -----");
        return "update";
    }
}

 

 

 

JSP

 

JSP 파일을 설정한다.

<!-- index.jsp -->

<body>
<h1><%= "Hello World!" %>
</h1>
<br/>
<a href="test">test</a>
<a href="member">member</a>
</body>
<!-- member.jsp -->

<body>
<h1>welcome spring world</h1>
<table border="1">
    <tr>
      <td style="background: bisque">회원가입</td>
      <td style="background: bisque">회원탈퇴</td>
      <td style="background: bisque">회원수정</td>
      <td style="background: bisque">회원정보</td>
    </tr>
    <tr>
        <td>
            <a href="insert?id=100&name=hong">
                <button>회원가입 처리 요청</button>
            </a>
        </td>
        <td>
            <a href="delete?id=100">
                <button>회원탈퇴 처리 요청</button>
            </a>
        </td>
        <td>
            <a href="update?id=100&name=hong">
                <button>회원수정 처리 요청</button>
            </a>
        </td>
        <td>
            <!-- 폼이 제출되면 '/one' 경로로 post 요청 전송 -->
            <!-- 사용자가 id 값을 입력하면 서버는 전달된 id 값을 받아서 처리 -->
            <form action="one" method="post">
                id : <input type="text" name="id" value="100"><br>
                <button>회원정보 처리 요청</button>
            </form>
        </td>
    </tr>
</table>
</body>
<!-- insert.java -->

<body style="background-color: darksalmon">
회원가입 신청 완료
</body>
<!-- delets.jsp -->

<body style="background-color: darksalmon">
회원탈퇴 신청 완료
</body>
<!-- test.jsp -->

<body style="background-color: darksalmon">
환영합니다.
</body>
<!-- update.jsp -->

<body style="background-color: darksalmon">
회원정보 수정 완료
</body>
<!-- one.jsp -->

<!-- JSP에 자바 코드를 삽입하기 위해서는 <% ... %> 사용 -->
<!-- homeVO라는 이름으로 저장된 객체를 가져옴 -->
<!-- request.getAttribute 메소드는 Object 타입 반환하므로 HomeVO 타입으로 캐스팅 -->
<%
    HomeVO homeVO = (HomeVO) request.getAttribute("homeVO");
    if(homeVO != null) {
%>

<!-- homeVO 객체의 id 값과 name 값을 HTML로 렌더링 -->
<p>ID : <%= homeVO.getId() %></p>
<p>NAME : <%= homeVO.getName()%></p>
<%
    }
%>
</body>

 

 

 

프로젝트 결과

 

위 코드를 실행한 프로젝트 결과는 다음과 같다.