인프런 강의 : 스프링 핵심 원리 강의를 듣던 중..
@PostConstruct
, @PreDestroy
애노테이션의 특징
- 최신 스프링에서 가장 권장하는 방법이다.
- 애노테이션 하나만 붙이면 되므로 매우 편리하다.
- 패키지를 잘 보면
javax.annotation.PostConstruct
이다. 스프링에 종속적인 기술이 아니라 JSR-250 라는 자바 표준이다. 따라서 스프링이 아닌 다른 컨테이너에서도 동작한다. - 컴포넌트 스캔과 잘 어울린다.
- 유일한 단점은 외부 라이브러리에는 적용하지 못한다는 것이다. 외부 라이브러리를 초기화, 종료 해야 하면 @Bean의 기능을 사용하자.
여기서 마지막 줄
유일한 단점은 외부 라이브러리에서는 적용하지 못한다.
라는 말이 있었는데.. 사실 이 말이 제대로 와닿지 않았다.
외부 라이브러리를 등록한다는 게 어떤 건지..
그래서 검색해본 결과
https://jojoldu.tistory.com/27
이동욱님 블로그에서 예시로 든 ObjectMapper를 보고 아~ 이런 라이브러리를 말하는 거구나 하고 와닿았다. ObjectMapper 안의 .class 파일 내부에 초기화 메소드나 소멸 메소드 위에 위의 어노테이션을 쓸 수 없으니 @Bean 에 선언하는 방법을 쓴다는 거였다.
https://www.inflearn.com/questions/264681
ObjectMapper
하니까 이전에 프로젝트에 추가한 ModelMapper
가 떠올랐다.
당시엔 bean
이나 이런 스프링에 대한 개념이 전혀 없어서.. ModelMapper
를 추가하고자 여러 블로그를 검색하고..
하나를 복사해서 붙여넣었는데..
아무래도 그 당시에도 @Bean
을 등록한다는 게 알지 못하는 영역이라 몰라서.. static Method로 등록했던 거 같다.
public class ModelMapperUtils {
private static ModelMapper modelMapper = new ModelMapper();
public static ModelMapper getModelMapper() {
return modelMapper;
}
}
근데 웃긴 건 이때는 진짜 bean에 대한 개념이 하나도 없어서 라이브러리 추가하고 modelMapper를 불러와서 써야하니깐
@Autowired
private ModelMapper modelMapper;
이렇게 불러서 썼었다. 당연히 바로 에러. 그래서 어떻게 하지 하고 검색하다 class 생성하고 static method 만들어서ModelMapperUtils.getModelMapper().map(source, destinationType)
이렇게 사용하고 있었다.
근데 다시금 소스를 찾아보니.. 이렇게 써도 되나 싶었음.ModelMapperUtils
를 호출할 때 마다 새로 new 로 ModelMapper
가 생성되기 때문에 성능이 떨어질 거 같단 생각이 들었음.
https://okky.kr/article/291799
그래서 검색해보니 .. 성능이 떨어지는 건 확실한 거 같다. 그게 유의미한 정도인지 까지는 모르겠지만..
기존 코드를
@Bean
public ModelMapper modelMapper() {
return new ModelMapper();
}
이렇게 등록하고
result = ModelMapperUtils.getModelMapper().map(entity, DTO.class);
기존의 이런 코드를
@Autowired
private ModelMapper modelMapper;
...
result = modelMapper.map(entity, DTO.class);
이렇게 바꾸면 될 것 같다.
@Bean
과 @Component
의 차이는 위 이동욱님 블로그에 잘 나와있는데, @Bean
의 경우 직접 컨트롤이 불가능한 외부 라이브러리를 빈 주입할 때 쓴다. @Component
는 Class 위에 선언 가능. (둘이 target이 다르다)
그러므로 ModelMapper
는 @Bean
을 사용해야 한다.
흠 저렇게 바꾸고 싶은데.. 그럼 의존성 주입을 다 새로 해야되서.. 안될듯.. 역시 이래서 처음 하는게 중요하다.
유의미한 차이가 있나..? 하고 인프런에 글을 올렸다. @bean 등록과 static method가 차이가 있는지..
https://www.inflearn.com/questions/309346
결론적으론 유의미한 차이는 아니라고 하셨다.
여기서 서포터즈 님께서 ModelMapper에 대한 성능에 대해 말씀해주셨는데.. 이건 익히 알던 내용이였다.
"ModelMapper는 건수가 많을 때 성능이 떨어지므로.. 쓰지 말자~ " 이러한 내용.
그래서 회사에 MapStruct 를 추가하려고 했으나.. 인텔리제이는 자동 컴파일이 되는데 이클립스는 컴파일을 항상 눌러줘야 되는 문제로.. (해결방안을 더 찾아보고 싶었지만.. 자꾸 내가 추가한 라이브러리로 오류가 발생하는 게 심적으로 고통이 커서..) MapStruct 라이브러리를 삭제하는 걸로 결론을 내렸다.
https://www.inflearn.com/questions/15292
영한님 답변에서도 dto entity 변환 시 modelMapper 보단 수동으로 작업해서 컴파일시 오류를 잡아낼 수 있게 한다고 하셨는데 (우아한 형제들의 경우 당연히 mapstruct를 사용할 줄 알았는데.. 아니여서 놀랐다.) 이게 맞는 말인 거 같다. mapstruct 같은 경우도 다른 케이스 작업할 때 그거 옵션 생각해서 적는 게 더 오래 걸렸었음... 뭐 간단한 경우엔 modelMapper 사용하는게 편하겠지만 그외 특수 케이스는 그냥 수동으로 설정하는 것이 좋을 것 같다.