본문 바로가기

Spring

spring Annotation 모음

spring을 하면서 다 까먹고 아직 잘 모르고 헷갈리는 거 왜 써야 하지..? Annotation이 너무너무너무 많았다.

 

Annotation은 주석이라는 뜻이다. 프로그램에 관한 데이터를 제공하는 데이터를 위한 데이터 메타 데이터..? 뭐 그렇다.

 

일단 내가 썼던것들 위주로 기록하고, 차차 추가하겠다. 이거 말고도 엄청 많다.

 

모르니까 너무 짜증 나서 꼭 정리해야지 마음만 먹고 이제 해본다. 정리하는데도 한세월일 듯..

 

난 아직 spring 응애라.. 틀린 게 있다면 꼭 말해주면 좋겠다.. 

 

@Component

  • Spring에게 해당 클래스가 관리해야 할 대상임을 알려준다. 이건 뭐다? 빈으로 등록된다!

 

@Controller 

  • Spring MVC임을 명시한다. ( Annotation 정리하려다가 MVC부터 정리하고 왔다. ㅋㅋ)
  • MVC 중에 Controller라고 지정해 준다.

@RequestMapping

  • 특정 URL로 요청이 오면 Controller에서 어떠한 방식으로 처리할지 정의한다.
  • DispactherServlet이 Controller를 찾고 논리적 주소가 매핑된 Method를 찾기 위해서는 @Controller단에 @RequestMapping이 쓰여야 한다.
  • 공통되는 URL의 경우 ("/login/login", "/login/logout" 등 /login이 공통) Class 레벨에 @RequestMapping 작성

@GetMapping

  • @RequestMapping(Method=RequestMethod.GET)와 동일

@PostMapping

  • @RequestMapping(Method=RequestMethod.POST)와 동일

@ResponseBody

  • HttpMessageConverter를 이용해서 자바 객체를 응답 본문(body)에 메시지를 만들어 반환한다.
  • 비동기 통신(ajax)에서 JSON 데이터를 보낼 수 있다. (ajax도 다뤄야 하네.. 언젠가.. 쓰겠다..)

@RequestBody

  • HttpRequest의 본문 RequestBody의 내용을 자바 객체로 매핑하는 역할이다.
  • GET 요청의 경우 @RequestBody로 받을 수 없다.

 

ResponseBody와 RequestBody에 대해 조금만 더 정리해 보겠다. @RequestBody 어노테이션으로 요청이 들어오면 DispatcherServlet에서 해당 HttpRequest의 미디어 타입을 확인하고, 타입에 맞는 HttpMessageConverter를 통해 데이터 변환이 일어난다. 왜냐? JSON 형태로 들어온 데이터를 Java에서 받으려면 Java Object로의 변환이 필요하기 때문이다. 응답도 마찬가지로 Java Object를 반환 타입에 맞게 변환해서 클라이언트로 전달하게 된다. 


 

@RestController

  • @Controller와 @ResponseBody가 결합된 어노테이션으로 method에 @ResponseBody를 안 붙여도 된다.

@RequestParam

  • Http 요청 파라미터를 이름으로 바인딩한다.
  • 파라미터 이름이 변수 이름과 같을 경우 name 속성은 생략이 가능하다.
  • 파라미터의 required는 기본값이 true이기 때문에 null이 넘어올 경우 에러가 난다.

@ModelAttribute

  • view에서 전달해 주는 파라미터를 객체의 멤버변수로 바인딩해 준다.
  • 가장 적절한 생성자를 찾아 객체를 생성 및 초기화한다.
  • @RequestMapping 메서드가 붙여진 Controller 클래스에 지원된다.

ModelAttribute에 대해 조금 더 정리해 보겠다. 내가 쓸 때는 @ModelAttribute를 딱히 선언하지 않아도 됐다. 빈 생성자와 정확한 setter, getter만 만들어주면 알아서 바인딩된다고 알고 있었으니까. 근데 그 이유가 뭐냐면 spring MVC 바인딩 메커니즘 때문이라고 한다. @ModelAttribute가 달린 매개변수나 주석이 달리지 않아도 매개변수 타입이 복합 객체라면 ModelAttributeMethodProcessor가 이를 처리하기 때문이다. 과정은 해당 객체의 인스턴스를 생성하고 요청 매개변수의 이름이 객체의 필드 이름과 일치하다면 해당 값을 필드에 설정한다. String이나 int 같은 기본 타입에는 보통 @RequestParam을 붙인다.


@Autowried

해당 인스턴스 변수에 스프링으로부터 자동으로 Bean을 주입한다. (new 연산자와 같다.)

 


난 사실.. 컴공으로써 이런 말이 좀 웃기지만 객체와 인스턴스 이런 기본적인 용어들이 맨날 헷갈린다. 알겠는데 설명하라고 하면 못하겠어. 또 정리해 본다. 일단 객체와 인스턴스를 알아보자. 객체는 클래스로부터 만들어지는 실체, 클래스로부터 선언된 변수이다. 이 객체가 메모리에 할당되어 실제 사용될 때를 인스턴스라고 한다. 하나의 클래스에서는 무수한 인스턴스들이 만들어질 수 있는 것이다. 이렇게만 하면 또 이해 못 한다. 예를 들어보자 Person이라는 클래스가 있으면 Person person = new Person(); 으로 생성된 person이 객체이다. 

@Autowired
private UserService userService;

 

이렇게 주입받는다고 예시를 들어보겠다. 스프링은 @Autowired가 붙은 필드에 자동으로 UserService 빈을 주입한다. (빈은 Spring Container가 관리하는 객체이다.) 이게 뭐다? new 연산자와 같다 했지 않은가. 빈을 주입한다 =  new UserService(); 이다. 그래서 우린 userService를 사용할 수 있는 것이다!


@Service

  • 서비스 객체로 비즈니스 로직과 관련된 모든 코드.
  • @Component에서 Business Layer 역할로 분리된 어노테이션.

 

@Repository

  • DAO 객체로 DB에 접근하는 코드.
  • @Component에서 Persistence Layer 역할로 분리된 어노테이션.

 


나온 김에 그냥 여기서 짚고 넘어가겠다. DTO와 DAO Service도 같이 다룰까 싶다. 이렇게 계층을 나누는 이유는 다 알다싶이 유지보수가 용이하기 때문이다. 그럼 뭘 기준으로 어떻게 나누는지 알아보자.

  • DTO (Data Transfer Object)는 계층 간 데이터 교환을 위한 객체를 말한다. 말 그대로 Client가 Controller에게 요청을 보낼때도, Controller가 Client에 응답을 보낼때도 DTO 형태로 데이터를 보내게 된다. 그래서 일반적으로 로직을 가지고 있지 않은 getter와 setter만 가진 순수한 데이터 객체이다. 번외로 VO(Value Object)와 동일한 개념으로 쓰이는 거 같은데 VO는 read only 속성을 가져 읽기만 가능하기 때문에 차이가 있다고 한다.
  • Service 계층은 DTO를 통해 받은 데이터를 이용해 비즈니스 로직을 처리하고, DAO를 통해 DB에 접근하여 데이터를 관리하는 역할을 한다.
  • DAO (Data Access Object)는 실제로 DB에 접근하는 객체를 말한다. Service와 실제 데이터베이스를 연결하는 역할을 한다. 그렇다 여기서 CRUD 작업을 한다!(제일 재밌는 객체..) 참고로 나는 mybatis와 JDBC로 작업했는데, JPA라는걸 나중에 알았다.. JPA에서 DAO 역할을 하는게 Repository라고 한다. JPA를 요즘 많이 쓴다고 하니까 나중에 공부해야겠다.. 할게 너무 많군 눈물 좔좔

@Transactional (선언적 트랜잭션)

  • 소스코드에 트랜잭션 관련 코드를 넣어두지 않고 비지니스 로직에서 완전히 분리한다. = Service메소드에서 사용
  •  PlatformTransactionManager을 사용하여 DB 접근이 하나라도 실패 시 rollback한다. 

@Test

  • 테스트용 메소드를 표현하는 Junit5 어노테이션 

* 참고로 Junit은 단위 테스트 프레임워크이다.

* assertTrue로 boolean 테스트 결과값을 얻을수 있다. (다른것도 많음)

 

 

참고 출처 

@RequestBody @ResponseBody 어노테이션 이해하고 사용하기 (tistory.com)

 

@RequestBody @ResponseBody 어노테이션 이해하고 사용하기

클라이언트와 서버의 통신(HTTP) @RequestBody, @ResponseBody Annotation을 이해하기에 앞서, 클라이언트와 서버 간 통신에 대해서 먼저 간단하게만 살펴보겠습니다. HTTP(HyperText Transfer Protocol) 통신이란, 브

wildeveloperetrain.tistory.com

https://dejavuhyo.github.io/posts/spring-annotation/

 

Spring Annotation 개념 및 정리

1. Annotation 이란

dejavuhyo.github.io

[Spring] 스프링 패키지 구조, DAO, DTO, Entity, Repository 에 대하여, DTO를 사용하는 이유 (tistory.com)

 

[Spring] 스프링 패키지 구조, DAO, DTO, Entity, Repository 에 대하여, DTO를 사용하는 이유

스프링 패키지 구조 스프링 패키지를 나눌 때 전체적인 그림은 일반적으로 [그림 1]과 같다. 이렇게 계층을 나누어 관리하는 것이 유지 보수하기에 용이하며 디버깅하기도 쉽다. DTO, DAO, Repository

code-lab1.tistory.com

Spring Annotation 개념 및 정리 | 공대베짱이 (dejavuhyo.github.io)

 

Spring Annotation 개념 및 정리

1. Annotation 이란

dejavuhyo.github.io