[SpringBoot] 주요 Annotation

윤경·2021년 12월 20일
1

Spring Boot

목록 보기
62/79

Annotation

: 사전적 의미로는 주석
자바에서의 의미는 코드 사이 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술


주요 annotation

@SpringBootApplication

: @Configuration + @EnableAutoConfiguration + @ComponentScan
으로 주로 메인클래스 위에서 사용됨.

@Configuration

: 설정을 위한 annotation으로 개발자가 생성한 클래스를 Bean으로 생성할 때 싱글톤 패턴으로 한 번만 생성하도록 함.

Configuration을 클래스에 적용한 후 @Bean을 해당 클래스 메소드에 적용하면 @Autowired로 빈을 부를 수 있음.

@EnableAutoConfiguration

: SpringApplicationContext를 만들 때 자동으로 설정하는 기능을 켬.

사용자가 필요할 것 같은 빈을 추측해 ApplicationContext를 만들 때 필요한 설정을 함. (Classpath를 기준으로 설정)

Ex. classpath에 tomcat-embeded.jar이 있다면 TomcatEmbeddedServletContainerFactory가 있을 것이라고 추측하여 설정함.

ApplicationContext

: Web Application 최상단에 위치한 Context, Spring에서 ApplicationContext란 BeanFactory를 상속받고 있는 Context

@ComponentScan

: 자동으로 컴포넌트 클래스를 탐색하고 탐색된 컴포넌트 및 클래스를 SpringApplicationContext에 등록하는 역할

메인 클래스가 위치한 루트 패키지부터 이하 모든 클래스를 검색해 빈으로 등록

@Component

: Bean을 생성할 때 new로 생성하듯 생성

Spring이 관리하는 모든 component에 대한 클래스를 빈으로 등록

@RestController

: @Controller + @ResponseBody를 합친 어노테이션
메소드의 반환 결과를 JSON 형태로 반환함.

@Controller VS @RestController

일반 @Controller 어노테이션은 API와 view를 동시에 사용하는 경우에 사용 (view 반환이 주목적)
@RestController 어노테이션은 view가 필요 없는 API만 지원하는 서비스에서 사용

@RequestMapping

: 요청 URL을 어떤 메소드가 처리할 것인지 매핑해주는 어노테이션

경로의 값에 따라 HTTP 요청이 해당 메소드에 매핑되어야 하는 것을 스프링에 알림.
Controller나 그 메소드에 적용

  • @GetMapping: @RequestMapping(Method=RequestMethod.GET)과 같은 의미
    HTTP Head에 담아 보내기 때문에 용량 제한이 있음
  • @PostMapping: 등록할 때 사용
    HTTP Body에 담아 보내며 @RequestMapping(Method=RequestMethod.POST)와 같은 의미

@Bean

: 객체
스프링 컨테이너에 빈을 등록하도록 하는 어노테이션

@Bean(name="")으로 원하는 id로 빈을 등록할 수도 있음.

@Bean VS @Component

@Bean개발자가 직접 제어 불가능한 외부 라이브러리를 만들 때 사용
@Component개발자가 직접 작성한 class를 빈으로 등록하기 위해 사용

@Autowired

: 의존성을 주입해 자동으로 객체를 생성해줌.
메소드 위에 사용할 경우 기본 생성자를 만들어줌.

또한, 의존성 주입시 주입하고자 하는 객체의 타입이 일치하는지 먼저 검사한 후, 객체를 자동으로 주입함.

Controller 클래스에서 DAO나 Service에 관한 객체들을 주입시킬 때 많이 사용함.

Bean을 주입받는 세 가지 방식

  1. @Autowired
  2. setter
  3. 생성자(@AllArgsConstructor) ➡️ 권장

@Inject

: @Autowired 어노테이션과 비슷한 역할 수행

@Transactional

: DB 트랜잭션을 해당 메소드에 적용하는 어노테이션

DB에 액세스하는 여러 연산을 하나의 트랜잭션으로 처리해 오류가 발생한 경우 롤백을 도와줌.

Ex. @Transaction(timeout=10) = "10초 내 해당 로직이 수행되지 못하면 롤백해라"

@Service

: Service 클래스에서 사용됨.
비즈니스 로직을 수행하는 클래스라는 것을 나타내기 위한 용도

@Repository

: DAO 클래스에서 사용됨.
DB에 접근하는 메소드를 가진 클래스에서 쓰임.

@Lazy

: 지연로딩 지원

@Component@Bean 어노테이션과 함께 쓰는데 클래스가 로딩될 때 스프링에서 바로 빈 등록을 바치는 것이 아니라, 실제로 사용될 시점에 로딩이 이루어지도록 하는 것.

@Valid

: = 유효성 검증이 필요한 객체임


Lombok Annotation

@RequiredArgsConstructor

: 초기화 되지 않은 상태의 final 키워드가 붙은 필드나, @NonNull 어노테이션이 붙은 필드에 대해 생성자를 생성해줌.

Lombok이 제공하는 어노테이션

@NoArgsConstructor

: 기본 생성자 제공

@NoArgsConstructor(access = AccessLevel.PROTECTED) 이처럼 접근 권한을 protected로 설정할 수 있다.

Entity Class를 프로젝트 코드상 기본 생성자로 생성하는 것은 금지하고, JPA에서 Entity 클래스를 생성하는 것은 허용하기 위해 추가함.

@Getter / @Setter

: Getter, Setter 자동 생성

@Data는 이들을 포함함. (하지만 이것은 사용하지 않는 것이 좋다!!)

@ToString

: 클래스 내 모든 필드의 toString 메소드를 자동 생성

@Builder

: 어느 필드에 어떤 값을 채워야 할지 명확히 생성하여 생성 시점에 값을 채워줌.


JPA Annotation

JPA를 사용하면 DB 데이터에 작업할 경우 실제 쿼리를 사용하지 않고 Entity 클래스의 수정을 통해 작업

@Entity

: 실제 DB 테이블과 매칭될 클래스임을 명시

@Table

: entity 클래스에 매핑할 테이블 정보를 알림.

Ex. @Table(name="USER")

어노테이션을 생략하면 클래스 이름을 테이블 이름 정보로 매핑함.

@Id

: 해당 테이블의 PK 필드를 나타냄.

@GeneratedValue

: PK 생성 규칙

@Column

: 테이블 컬럼

굳이 선언하지 않더라도 해당 클래스의 필드는 모드 컬럼이 됨.
(생략하면 필드명을 사용해 컬럼명과 매핑)

Ex. @Column(name="username")
이처럼 기본값 외의 추가로 변경이 필요한 옵션이 있을 경우 사용함.


호춘쿠키님
gillog님

profile
개발 바보 이사 중

0개의 댓글