[스프링] Annotation 정리

Jaedeok Lee·2021년 10월 10일
0

Spring

목록 보기
3/3
post-thumbnail

Annotation

Annotation이란 method나 class 위에 @가 붙은 텍스트를 말한다. Method나 class 위에 붙은 annotation은 특별한 기능을 수행하게 된다. 즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라 볼 수 있다.

메타 데이터(meta data) : 데이터를 위한 데이터

Spring Annotation

Spring FrameworkSpring MVC 패턴을 따르며 각 모듈별로 사용하는 annotation이 상이하다. 간단하게 Controller, Model, Repository, Service에서 자주 쓰이는 annotation을 (매우 간단하게...)정리하고자 한다.

❗ 꼭 작성된 모듈에서 annotation을 사용하지 않아도 됩니다.

Controller

@RestController

  • RestController를 알기 전에 먼저 @Controller를 알아야 한다. 둘의 결정적인 차이는 HTTP Response Body가 생성되는 방식의 차이다.
    @Controller는 아래와 같은 과정을 통해 주로 View를 반환할 때 사용한다.

@RequestMapping

  • 요청 URL을 어떤 메서드가 처리할 지 mapping해주는 어노테이션이다.
    컨트롤러나 컨트롤러의 메서드에 적용한다.
    // 예시
    @RequestMapping("/list"), @RequestMapping("/home, /about")
    @RequestMapping("/admin", method=RequestMehod.GET)

@GetMapping

  • @RequestMapping(Method=ReqeustMethod.GET)과 같음
    @PostMapping, @PutMapping, @PatchMapping, @DeleteMapping은 유추 가능하므로 생략

Model

@Entity

  • 테이블과 연결될 클래스에 사용한다.
    기본적으로 클래스의 카멜케이스 이름을 언더바 네이밍으로 테이블 이름을 매칭해준다.

    예시) UserTableuser_table

@Id

  • 해당 테이블의 PK값에 사용한다.

@GeneratedValue

  • PK값의 생성 규칙을 표시할 때 사용한다. 주로 사용되는 Auto_Increment를 사용하기 위해서는 GenerationType.IDENTITY를 사용하며 다음과 같이 코드를 작성한다.
@GeneratedValue(strategy = GenerationType.{option})
  • GenerationType의 종류는 다음과 같다.
  1. IDENTITY : 데이터베이스에 위임
  2. AUTO : 방언에 따라 자동 지정, GenerationType을 명시하지 않을 경우 기본값으로 사용된다.
  3. SEQUENCE : 테이터베이스 시퀀스 오브젝트 사용
  4. TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용

@OneToOne, @ManyToMany, OneToMany

  • 관계를 매핑할 때 사용된다.
// 예시
@OneToMany(mappedBy = "{Table name}", fetch=FetchType.{option})

JoinTable

  • 해당 테이블을 Join함
//예시
@JoinTale(
	    name = "{Table name}",
            joinColumes = @JoinColumn(name = "{Attribute name}"),
            inverseJoinColumns = @JoiColumn(name = "{Attribute name}"))

Repository

@EntityGraph

  • JPA가 어떠한 Entity를 불러올 때 이 Entity와 관계된 Entity를 불러올지에 대한 정보를 제공한다.

  • EntityGraph는 FetchLoad 두가지 타입으로 나뉜다.
    FETCH :entity graph에 명시된 attribute는 FetchType.EAGER이고 명시되지 않은 attribute는 FetchType.LAZY이다.
    LOAD : entity graph에 명시된 attribute는 FetchType.EAGER이고 명시되지 않은 attribute는 명시되어 있는 FetchType이나 기본값인 FetchType이다.

//예시
@EntityGraph(attributePaths = {"Entity Name"})

@Query

  • 직접 Query문을 작성한다.
//예시
@Query("Query")

Service

@Service

  • Service 로직을 구현할 클래스에 사용한다.

기타

@SpringBootApplication

해당 어노테이션이 붙어잇는 메인 어플리케이션 클래스의 위치를 프로젝트 디폴트 패키지의 루트에 위치시키는 것을 추천한다.

@Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 어노테이션으로 합친 것이다.

@RequiredArgsConstructor

  • 초기화 되지 않은 final 필드나, @NotNull이 붙은 필드에 대해 생성자(Constructor)를 만들어 준다.

@Slf4j

  • Logging에 대한 abstract layer를 제공하는 interface의 모음, Interface를 사용하여 logging을 구현하게 되면 좋은 점은 추후에 필요로 의해 logging library를 변경할 때 코드의 변경 없이 가능하다.
    한마디로 로그 남길 때 쓰인다.

@Autowired

  • 필요한 dependency 객체의 Type에 해당하는 Bean을 찾아 주입한다.
  • Contructor, Setter, Field와 같이 3가지 경우에 사용되며 기본값으로 true이기 때문에 Dependency Injection할 대상을 찾지 못한다면 어플리케이션 구동에 실패한다.

@Component

@Compoenent는 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 Annotation이다.

@Component
public class Hello{
	public Hello(){
    	System.out.println("Hello World");
    }
}
@Component(value="mtstudent")
public class Hello{
	public Hello(){
    	System.out.println("Hello World");
    }
}

Component에 대한 추가 정보가 없다면 Class의 이름을 CamelCase로 변경하는 것이 Bean id로 사용된다.
하지만 @Bean과 다르게 @Component는 name이 아닌 value를 이용해 Bean의 이름을 지정한다.

@Confuguration

Configuration을 클래스에 적용하고 @Bean을 해당 클래스의 메소드에 적용하면 @AutowiredBean을 부를 수 있다.

@Bean

  • Bean을 정의할 때 사용한다.

참고

profile
궁금하거나 추가해야 되는 부분 있으면 댓글 달아주세요~

0개의 댓글