이전 포스팅에서 framework 와 Spring 에 대해 정리 했지만, 간단히 다시 정리하고 넘어가야 겠다.
Spring 은 Java EE(Web) 기반 개발의 비즈니스 로직을 제외한 서비스의 공통적인 부분을 API 로 제공하여 생산성과 유지보수성을 높이도록 도와준다.
Struts framework 기반에서 Spring framework 로 리팩터링 진행하면서 개발 속도에 가장 큰 변화가 있었다.
propertie 파일에서 .do 를 각 클래스 경로로 매핑하는 것은 이제 없어졌다.
대신 spring framework 도 xml 에 meta-data 를 저장해 두어야 한다.
다음은 xml 설정 내용의 일부 예시이다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<!-- 어노테이션 기반 :: Spring Framework 사용. :: filter -->
<context:component-scan base-package="com.model2.mvc.service">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" />
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- ■ Annotation 기반 모든 기능을 사용 할 수 있는 아래로 설정 -->
<mvc:annotation-driven />
...
</beans>
annotation 기반 코딩(Spring boot) 으로 넘어가는 과도기에 있는 상황
Spring framework 사용에도 편리함은 있지만, xml 기반 meta-data 가 많다.
아래는 회원관리 관련 Controller 예시이다.
//==> 회원관리 Controller
// Controller 임을 명시하면 해당 클래스의 역할을 Spring 이 인지한다.
@Controller
// "/user/*" 아래로 들어오는 모든 요청을 매핑한다.
@RequestMapping("/user/*")
public class UserController {
///Field
// UserService 를 상시 사용 가능하도록(has a 관계) wiring 해주었다.
@Autowired
@Qualifier("userServiceImpl") // DI 할 Bean 이름을 지정해 주었다.
private UserService userService;
//setter Method 구현 않음
public UserController(){
System.out.println(this.getClass());
}
// Spring boot 이용 시 보통 하기 방식으로 Wiring 한다.
//@Qualifier("userServiceImpl") // DI 할 Bean 이름을 지정해 주었다.
//private final UserService userService;
//@Autowired
//public UserController(UserService userService){
// this.userService = userService;
// System.out.println(this.getClass());
//}
// "/user/getUser" 로 들어온 요청 중 GET 방식 요청을 처리해주는 method
@RequestMapping( value="getUser", method=RequestMethod.GET )
public String getUser( @RequestParam("userId") String userId , Model model ) throws Exception {
System.out.println("/user/getUser : GET");
//Business Logic
User user = userService.getUser(userId);
// Model 과 View 연결
model.addAttribute("user", user);
// 하단 페이지로 포워드 시키도록 한다.
return "forward:/user/getUser.jsp";
}
기존에 C,R,U,D 등 기능 각 1개 추가되면 Action 파일(ex.
GetUserAction.java
) 이 늘어났었으나, 이제는 기능 하나 당 method 1개로 해결 가능해졌다.
하지만, 아직도 meta-data (xml 파일) 가 많다.
그래서 no meta-data 를 위해 Spring 에서 더욱 발전되어 나온 것이 Spring boot 이다.
- 장점 : meta-data 가 없다.
- 단점 : meta-data 가 없다.
meta-data 가 없다는게 장점이자 단점이다.
no meta-data 를 모토로 하는 Spring boot 는 annotation 하나 만으로 수 많은 설정이 필요 없이 구현에만 집중할 수 있게 해준다. 메타데이터 설정 하는데 드는 시간을 굉장히 많이 아낄 수 있다는 것은 굉장히 큰 장점이다.
하지만 단점으로도 꼽은 이유는, 해당 annotation 기반 개발 이전의 히스토리를 모르는 채로 바로 Spring boot 를 사용하다가 문제가 발생 했을 때, 문제 해결 능력이 현저히 떨어지게 되는 단점이 있다.
나도 다른 프레임워크 등을 사용하면서 분명 정보, 절차은닉 된(캡슐화 된) 기술들이 있을테니, 가급적 동작 원리를 알면서 개발할 수 있도록 주의해야겠다.