스프링 어노테이션 정리

노요셉·2019년 12월 27일
0

@Data : @Data는 위에서 설명드린 @Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode을 한꺼번에 설정해주는 매우 유용한 어노테이션입니다.

레퍼런스 : [자바] 자주 사용되는 Lombok 어노테이션- DaleSeo

@NoArgsConstructor: @NoArgsConstructor 어노테이션은 파라미터가 없는 기본 생성자를 생성해주고, @AllArgsConstructor: @AllArgsConstructor 어노테이션은 모든 필드 값을 파라미터로 받는 생성자를 만들어줍니다.
@RequiredArgsConstructor: @RequiredArgsConstructor 어노테이션은 final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 만들어줍니다.

@Inject, @Autowired, @Resource
세 어노테이션 모두 의존관계를 연결해주는 기능을 합니다.
@Autowired는 스프링 전용
@Inject, @Resource는 자바에서 지원합니다.

https://jeong-pro.tistory.com/151

Controller에서 유효성 체크할때
@Valid란 어노테이션을 통해 DTO에서 프로퍼티값에 유효성체크를 해둘 수 있습니다~
https://bamdule.tistory.com/35

어노테이션 커스텀
https://cheese10yun.github.io/spring-custom-valdate-annotation/

@Controller, @RestController

전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용합니다. 아래와 같은 과정을 통해 Spring MVC Container는 Client의 요청으로부터 View를 반환합니다.

하지만 Spring MVC의 컨트롤러에서도 Data를 반환해야 하는 경우도 있습니다. Spring MVC의 컨트롤러에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용해주어야 합니다. 이를 통해 Controller도 Json 형태로 데이터를 반환할 수 있습니다.
https://mangkyu.tistory.com/49

@SpringBootTest
@AutoConfigureMockMvc

@SpringBootTest
정리된 내용은 "통합테스트"를 할 수 있다.
기본적으로 server를 시작하지 않는다. test하고싶은 web endpoint(우리가 주로사용하는 REST API 를 말하는 듯)를 mock 환경에서 테스트할 수 있다.

  • 실제 객체를 만들기엔 비용과 시간이 많이 들거나 의존성이 길게 걸쳐져 있어 제대로 구현하기 어려울 경우, 가짜 객체를 만들어 사용한다.
  • WebApplicationContext를 로드하며 내장된 서블릿 컨테이너가 아닌 Mock 서블릿을 제공한다.
  • 별도로 지정하지 않으면 기본값은 Mock 서블릿을 로드하여 구동하게 된다.
    webEnvironment를 선택함(RANDOM_PORT, DEFINED_PORT를 이용해서)에따라 실제 서블릿 환경을 구성할 수 있다.

출처: https://goddaehee.tistory.com/211 [갓대희의 작은공간]

@SpringBootTest가 하는 역할은 @SpringBootApplication을 찾아서 테스트를 위한 빈들을 다 생성한다. 그리고 @MockBean으로 정의된 빈을 찾아서 교체한다.

@RunWith(SpringRunner.class)랑 같이 써야 함

빈 설정 파일은 안해주나? 알아서 찾는다. (@SpringBootApplication)

출처: https://ict-nroo.tistory.com/96 [개발자의 기록습관]

아직도 완전히 이해가 되는 건 아니지만, 그냥 계속해서 살을 붙여야할 것 같음.
Spring테스트 관련 블로그들만 보다가 그 블로그 내용의 원천이 궁금했는데
역시 스프링 공식문서였음.

참조한 블로그에서 알려줘서 알게됌;;
참조: https://goddaehee.tistory.com/211?category=367461

@AutoConfigureMockMvc

  • @WebMvcTest와 가장 큰 차이점은은 컨트롤러뿐만 아니라 테스트 대상이 아닌 @Service나 @Repository가 붙은 객체들도 모두 메모리에 올린다는 것이다.

  • 간단하게 테스트하기 위해서는 @AutoConfigureMockMvc가 아닌 @WebMvcTest를 사용해야 한다.

  • @WebMvcTest는 @SpringBootTest와 같이 사용될 수 없다. 왜냐하면 각자 서로의 MockMvc를 모킹하기 때문에 충돌이 발생하기 때문이다.

참조: https://elevatingcodingclub.tistory.com/61

@Mock vs @MockBean
https://velog.io/@ausg/Mockito-Test-Framework-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0#%EA%B8%80%EC%93%B4%EC%9D%B4-

@PersistenceContext
Spring이 JPA의 영속성컨텍스트를 Inject해주는 어노테이션입니다.
EntityManagerFactory에서 EntityManager를 꺼내고 쓸 필요가 없어요.
https://kihoonkim.github.io/2017/01/27/JPA(Java%20ORM)/2.%20JPA-%EC%98%81%EC%86%8D%EC%84%B1%20%EA%B4%80%EB%A6%AC/

@SpringBootApplication이 패키지 하위에 있는 @Component는 ComponentScan에 걸려서 Spring Bean에 자동 등록됩니다.

@EqualsAndHashCode(callSuper=false)
https://n1tjrgns.tistory.com/164

@Transactional(readOnly = true)
https://velog.io/@rxjw95/ErrorSpring-boot%EC%97%90%EC%84%9C-Transactionaloption%EC%9D%B4-%EB%90%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EA%B2%BD%EC%9A%B0

같은 질문을 수업 댓글에 남겨주셔서 그쪽에 남긴 댓글을 붙여 넣습니다.

네, isolation 레벨은 별다른 설정을 하지 않으면 DB의 기본값을 따라갑니다. 아시다시피 그 설정은 다른 트랜잭션과의 동시 접속 방법을 제어하는 방법으로 @Transactional 애노테이션에 직접 설정할 수 있습니다. 물론, 설정하더라도 DB가 해당 isolation 레벨을 지원하지 않는다면 적용되지 않겠지만요.

readOnly는 현재 해당 그 트랜잭션 내에서 데이터를 읽기만 할건지 설정하는 겁니다. 이걸 설정하면 DB 중에 read 락(lock)과 write 락을 따로 쓰는 경우 해당 트랜잭션에서 의도치 않게 데이터를 변경하는 일을 막아줄 뿐 아니라, 하이버네이트를 사용하는 경우에는 FlushMode를 Manual로 변경하여 dirty checking을 생략하게 해준다거나 DB에 따라 DataSource의 Connection 레벨에도 설정되어 약간의 최적화가 가능합니다. 아마 이 부분에서 특정 DB는 말씀하신대로 isolation 레벨이 READ_UNCOMMITED 처럼 동작할 여지도 있는 것 같습니다. 그런데 그게 꼭 좋은 건지는 생각해 봐야겠네요. READ_UNCOMMITED 면 팬텀 Read가 가능하단 거니까 isolation level을 명시적으로 선언해야 할지도 모르겠네요.

좋은 질문 감사합니다.
https://www.inflearn.com/questions/7185

@Repository
https://codevang.tistory.com/258

profile
서로 아는 것들을 공유해요~

0개의 댓글