스프링

Spring- Lombok의 이해와 @Annotation (계속 추가합니다.)

지팡구 2022. 12. 14. 23:42

자바진영의 어떤 서비스를 다루다보면 우리는 편하게 @Annotation을 접할 수 있을 것이다.

이 어노테이션은 각 프레임워크나 라이브러리가 지원해주는 다양한 기능들을 내포하고 있다.

 

물론 무조건 사용하라는 법은 없지만 아무래도 이미 개발된 내용의 기능들을 가져다 사용하면 코드의 가독성도 증가하고 해당 로직을 작성하는데 소모되는 에너지를 줄일 수 있을 것이다.  (직접 어노테이션을 만들어서 사용도 가능하다.)

이 글은 해당 어노테이션이 어떤 기능을 제공하는지를 학습하면서, 그 과정속에서 얻게된 정보들을 정리하는 글 입니다.

 

1. Annotation 

- @을 이용한 주석, 코드에 주석을 달아 특별한 의미를 부여한 것

- 컴파일러가 특정 오류를 억제하도록 지시하는 것과 같이 프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공.

- 코드에 정보를 추가하는 정형화된 방법

- 즉, 프로그램에게 추가적인 정보를 제공해주는 메타데kiang이터(Meta-data : 데이터를 위한 데이터)

 

이 어노테이션은 JDK 1.5버전 이상부터 사용이 가능하며 클래스 파일에 임베디드 되어 컴파일러에 의해 생성된 이후 JVM에 포함되어 동작한다. 

 

  • 런타임 시점에 특정 기능을 실행하도록 정보를 제공
  • 개발 환경이 빌드나 배포시 코드를 자동으로 생성할 수 있도록 정보 제공
  • 컴파일러에게 작성한 코드의 문법을 체크하도록 정보 제공

2. Spring - - - - - - Lombok

Java 기반의 라이브러리로, 어노테이션을 기반으로 코드를 자동완성 해주는 라이브러리가 있다. 

 

대표적으로 우리가 사용하는 @Getter, @Setter 등이 있는데, 

  • 클래스 이름 위에 적용하면 모든 변수들에 적용 가능, 변수 이름 위에 적용하면 해당 변수들만 사용 가능하며,
  • 생성된 접근자와 설정자 메서드를 사용할 수 있음.
  • 어떠한 필드에 선언하면 자동으로 get.xxx() , set.xxx() (boolean 타입인 경우 is.xxx() )메소드를 생성해줌.

 

2.1 어노테이션 정리

 

  • @ToString

필드를 기반으로 ToString 메서드를 자동으로 생성


  • @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor (생성자를 만들어주는 어노테이션)

생성자를 자동으로 만들어주는 어노테이션

 

@NoArgsConstructor

매개변수가 없는 기본 생성자를 생성하며, 어떠한 변수도 사용하지 않는 기본 생성자를 자동완성 한다.

 

@AllArgsConstructor

필드 값을 모두 포함한 생성자를 생성한다. ( 모든 변수를 사용하는 생성자를 자동 완성 )

 

@RequiredArgsConstructor

final 필드와 @NotNull 어노테이션이 붙은 필드에 대한 생성자를 생성하며 Required -> 즉, 꼭 필요한 객체의 변수를 인수로 받는 생성자를 구현해준다. 

 

참고 : https://projectlombok.org/features/constructor (lombok 공식 문서)


  • @Data

@Getter, @Setter, @RequiredArgsConstuctor, @TosSting, @EqulasAndHashCode 를 한번에 설정해주는 어노테이션


  • EqualsAndHashCode

- Equals와 hashCode 메서드를 자동으로 생성해주며, callSuper를 사용해 메서드 자동 생성 시 부모 클래스의 필드까지 고려할 것인지 설정 가능.

- callSuper = true이면 부모 클래스 필드 값도 동일한지 고려하고, callSuper=false(기본값)로 설정하면 자신 클래스의 필드 값들만 고려


  • @Builder

- 모델 객체를 생성할 때, Builder를 자동으로 추가해주는 어노테이션

- 다수의 필드를 가지는 클래스의 경우, 생성자 대신에 빌더를 사용하는 경우가 多

여기서 model 객체란?

1. Controller에서 생성한 데이터를 담아 View로 전달할 때 사용하는 객체

2. addAttribute("키", "값") 메서드를 사용해 전달할 데이터 세팅


  • @Entity

- 데이터베이스의 테이블과 일대일로 매칭되는 객체 단위

- @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라고 불림

- JPA에서 엔티티는 테이블에 대응하는 하나의 클래스

- JPA에서는 '하나의 엔티티 타입을 생성한다'라는 의미는 '하나의 클래스를 작성한다'라는 의미가 됨.


  • @Id

- 데이터베이스의 테이블은 기본적으로 유일한 값을 가지게 되는데 그것을 primary key(기본키) 라고 하며, @Id 어노테이션을 통해 primary key를 설정할 수 있음.


  • @GeneratedValue (ver.2)

- 기본키의 데이터 형식은 정해져있지 않아서 구분이 가능한 유일한 키 값을 가지고 있어야 하는데, 대부분 Long을 주로 사용

* 직접 할당 (@Id) 만 사용

* 자동 생성 (@GeneratedValue)

- IDENTITY : 데이터베이스에 위임 (MYSQL)

 

* Auto_increment

( auto increment 방식은 숫자형의 기본키 속성을 auto increment로 지정하면 새로운 레코드가 생성될 때마다 마지막 기본키 값에서 자동으로 +1을 해주는 방식, @GeneratedValue의 strategy 속성을 GenerationType.IDENTITY로 지정해 auto increment 컬럼인 것을 EntityManager에 알려줌)

- SEQUENCE : 데이터베이스 시퀸스 오브젝트 사용(ORACLE)

* @SequenceGenerator 필요

- TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용

* @TableGenerator 필요

- AUTO : 방언에 따라 자동 지정, 기본값


  • @Column

- @Column은 데이터베이스의 테이블에 있는 컬럼과 동일하게 1:1로 매칭되기 때문에 Entity클래스안에 내부변수로 정의됨.


  • @Controller

- 사용자의 요청이 진입하는 지점(entry point)

-요청에 따른 처리 방법을 결정, 실질적인 처리는 서비스(Layered Architecture)에서 담당

- 사용자에게 View(또는 서버에서 처리된 데이터를 포함한 VIew)를 응답으로 보내줌

- Model 객체를 만들어 데이터를 담고 View를 찾는 것


  • @RequestMapping

- 해당 어노테이션으로 선언된 클래스의 모든 메소드가 하나의 요청에 대한 처리를 할 경우 사용

- URL을 컨트롤러의 메서드와 매핑할 때 사용함


  • @RestController

- @Controller와 @ResponseBody의 조합

- @RestControll는 단순히 객체만 반환하고 객체 데이터는 JSON, XML 형식으로 HTTP 응답에 담아 전송

- @Controller와 @ResponseBody를 사용하여 만들 수 있지만 RESTful 웹서비스의 기본 동작이라 Spring