개요
스프링 프레임워크 버전 4.2에서 4.3으로 버전업을 수행했을 때 어떠한 변화가 일어나는지 알아보자.
시멘틱 버저닝에 대한 설명
아래는 스프링 프레임워크 버저닝에 대한 오피셜한 설명입니다.
- MAJOR, if incremented, may involve a significant amount of work to upgrade. / Major features and potential breaking changes
- MINOR, if incremented, should involve little to no work to upgrade. / Backward compatible features
- PATCH, if incremented, should involve no work. / Backward compatible fixes and improvements
이번 버전업은 MINOR 에 해당하는 버전업으로 과거 버전과 완벽하게 호환됩니다.
개선사항
Implicit Constructor Injection
- 생성자를 통한 의존성 주입 시에
@Autowired
가 없어도 자동으로 타입에 맞는 빈을 탐색하여 가져오는 기능 - 스프링 진영에서 생각하는 가장 이상적인 의존성 주입 방향성입니다.
@Service
public class FooService {
private final FooRepository repository;
@Autowired
public FooService(FooRepository repository) {
this.repository = repository
}
}
@Service
public class FooService {
private final FooRepository repository;
public FooService(FooRepository repository) {
this.repository = repository
}
}
단,
FooRepository
타입의 빈은 컨테이너 상에 단 하나만 존재하여야 함
@Configuration
Implicit Constructor Injection
- 위와 동일한 기능이
@Configuration
애노테이션의 클래스에서도 가능
@Configuration
public class FooConfiguration {
private final FooRepository repository;
public FooConfiguration(FooRepository repository) {
this.repository = repository;
}
@Bean
public FooService fooService() {
return new FooService(this.repository);
}
}
Default Methods Support
- 자바
Interface
의default
메서드를 통한 빈 생성이나 라이프사이클 메서드를 이용할 수 있습니다.
package com.logicbig.example;
import javax.annotation.PostConstruct;
public interface IMyBean {
@PostConstruct
default void init() {
System.out.println("post construct: "+this.getClass().getSimpleName());
}
}
package com.logicbig.example;
import org.springframework.context.annotation.Bean;
public interface IMyConfig {
@Bean
default MyBean myBean() {
return new MyBean();
}
}
package com.logicbig.example;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig implements IMyConfig {
public static void main(String[] args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(MyConfig.class);
MyBean bean = context.getBean(MyBean.class);
bean.showMessage("a test message");
}
}
HTTP HEAD and HTTP OPTIONS
- HTTP Method 별 매핑 지원
@GetMapping
,@PostMapping
,@PutMapping
,@DeleteMapping
,@PatchMapping
@RequestMapping(method = RequestMethod.GET)
보다 짧고, 의도가 명확합니다.- 의도치 않은
HTTP method
를 제공하여 생길 수 있는 실수를 방지합니다.
스코프별 빈 생성 가능
@RequestScope
,@SessionScope
- 해당 스코프에서만 존재하는 빈 생성이 가능합니다.
- 긴 생명주기가 필요 없는 작업의 경우 유용합니다.
@Service
@RequestScope
public class UserContextService {
private User currentUser;
@Autowired
private UserRepository userRepository;
public void setCurrentUser(String username) {
this.currentUser = userRepository.findByUsername(username);
}
public User getCurrentUser() {
return currentUser;
}
}
@Controller
@RequestMapping("/profile")
public class ProfileController {
@Autowired
private UserContextService userContextService;
@GetMapping
public String showProfile(Model model) {
User currentUser = userContextService.getCurrentUser();
model.addAttribute("currentUser", currentUser);
return "profile";
}
}
@RestControllerAdvice
- Rest API 에서 예외가 발생했을 때 전체적 관리 가능한 애노테이션
- Custom Exception 클래스들을 생성하고, 이에 따른 에러 메세지를 일관성 있게 관리할 수 있습니다.
@RestControllerAdvice
public class CustomExceptionHandler {
@ExceptionHandler(value = { InvalidRequestException.class })
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorMessage handleInvalidRequestException(InvalidRequestException ex) {
return new ErrorMessage(ex.getMessage());
}
@ExceptionHandler(value = { ResourceNotFoundException.class })
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorMessage handleResourceNotFoundException(ResourceNotFoundException ex) {
return new ErrorMessage(ex.getMessage());
}
// other exception handlers...
}
@RequestAttribute
- 요청에서 온 값을 별도의 클렌징 과정 없이 바로 받아보는 애노테이션
- 별 것 아닌 것 같아 보이지만, 코드에서 사용되는 입력값들을 파라미터에서 한눈에 볼 수 있다는 점이 큽니다.
before
@Controller
@RequestMapping("/example")
public class ExampleController {
@RequestMapping("/showUserId", method = RequestMethod.GET)
public String showUserId(HttpServletRequest request, Model model) {
String b2cId = request.getParameter("b2cId"); // 추가 변수 선언 필요
model.addAttribute("b2cId", b2cId);
return "showUserId";
}
}
after
@Controller
@RequestMapping("/example")
public class ExampleController {
@GetMapping("/showUserId")
public String showUserId(@RequestAttribute("b2cId") String b2cId, Model model) {
model.addAttribute("b2cId", b2cId);
return "showUserId";
}
}
@SessionAttribute
- 세션에 있는 값을 별도의 파싱 없이 바로 받아보는 애노테이션
before
@GetMapping("/showUser")
public String showUser(HttpSession session, Model model) {
String b2cId = (String) session.getAttribute("b2c_id"); // 강제 타입 캐스팅이 필요함.
model.addAttribute("b2cId", b2cId);
return "showUser";
}
after
@GetMapping("/showUser")
public String showUser(@SessionAttribute("b2cId") String b2cId, Model model) {
model.addAttribute("b2cId", b2cId);
return "showUser";
}
조금 더 높은 버전의 서드파티 라이브러리 이용 가능
- Hibernate ORM 5.2 (still supporting 4.2/4.3 and 5.0/5.1 as well, with 3.6 deprecated now)
- Jackson 2.8 (minimum raised to Jackson 2.6+ as of Spring 4.3)
- OkHttp 3.x (still supporting OkHttp 2.x side by side)
- Netty 4.1
- Undertow 1.4
- Tomcat 8.5.2 as well as 9.0 M6
보안
- 현재 사용 중인 4.2.4 버전에 보안 문제 13개 존재
- 4.3.30 까지 가면 보안 문제는 5개로 줄어들음
레퍼런스
반응형
'프레임워크 > 스프링 프레임워크' 카테고리의 다른 글
@EnableRedisHttpSession 은 어떻게 동작하는가? (feat. 스프링 세션에 레디스 활용하기) (0) | 2023.04.19 |
---|---|
RedirectAttributes 란? (feat. addFlashAttribute 에 대한 설명 포함) (0) | 2023.04.17 |
DispatchServlet.doDispatch() 함수 끝까지 따라가서 HandlerMapping 과 HandlerAdapter 알아보기 (0) | 2023.01.30 |
스프링 객체 검증 (Validation) 적용하기 (0) | 2022.05.29 |
asciidoctor 를 통한 Spring REST Docs 자동 생성 세팅하기 (2) | 2022.05.18 |