[Spring] 자주 쓰는 Lombok 어노테이션

김재연·2023년 3월 1일
1

수숙관

목록 보기
3/17
post-thumbnail

자주 쓰는 Lombok 어노테이션을 정리햅오자.

스프링 빈으로 자동 등록해주는 역할인 @Controller, @Service, @Repository는 제외!

@RestController는❓
" @RestController = @Controller + @ResponseBody "
즉, JSON 형태로 객체 데이터를 반환한다.
@RestController를 쓰면 이 안에 있는 모든 컨트롤러가 JSON 형태의 객체 데이터를 반환해야 하기 때문에, 그 안에 반환값이 다른 컨트롤러도 만들고싶다면 @Controller를 쓰고 JSON으로 반환할 컨트롤러에만 따로 @ResponseBody를 붙여주면 된다.

1. Domain

- @Getter, @Setter

: 접근자, 설정자 자동 생성
xxx라는 필드를 선언하면 자동으로 getXxx()setXxx() 메소드를 생성한다.

@Getter @Setter
private String name;

=> user.setName("홍길동"); 이나 user.getName();을 쓸 수 있다.

- @Entity, @Table

  • @Entity : JPA에서 사용할 엔티티
    name 속성에 JPA에서 사용할 엔티티 이름을 지정하는데, 아무것도 안쓰면 기본값으로 클래스 이름을 쓴다.

  • @Table : 해당 엔티티와 매핑할 테이블
    name 속성에 매핑할 테이블 이름을 지정하는데, 기본값은 엔티티 이름이다.

@Entity
@Table(name = "name")
public class Name { ...(생략)...}

=> Name이라는 엔티티는 name이라는 테이블에 매핑된다.

- @Id, @GeneratedValue, @Column

  • @Id : 해당 필드를 테이블의 기본 키(PK)에 매핑
    @Id만 사용할 경우 기본 키를 직접 할당해 주어야 하는데, 기본 키를 직접 할당하는 대신 데이터베이스가 생성해주는 값을 사용하려면 @GeneratedValue를 사용해야한다.
  • @GeneratedValue : 기본 키를 자동으로 생성
    주로 strategy = GenerationType.IDENTITY 속성을 쓰는데, 이는 기본 키 생성을 데이터베이스에 위임한다는 뜻이다.

    @GeneratedValue(strategy = GenerationType.IDENTITY)를 붙이면 API 테스트 할때 굳이 id까지 넣어주지 않아도 알아서 1,2,3,... 으로 만든다~!

  • @Column : 해당 필드를 테이블 컬럼에 매핑
    nullable 속성은 null 값의 허용 여부를 설정하는데, false 설정 시 비어있을 수 없는 값이 된다. (꼭 넣어야한다는 뜻)

    ❗🤔Entity 클래스에 정의된 모든 내부 변수는 기본적으로 @Column을 포함하고 있기 때문에 별다른 옵션을 지정하지 않는다면 생략할 수 있다.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
private String name;

=> id 필드를 pk로 쓸 것이고, 기본키 생성은 데이터베이스에 위임할 것이며, name 필드는 테이블의 컬럼이 될 것인데, null값을 허용하지 않겠다는 뜻이다.

이 외에도 @OneToMany@ManyToOne 등 다양한 연관관계를 매핑할수도 있다.

2. Controller

- @RequestMapping, @{Get/Post/Put/Delete} Mapping

: 들어온 요청을 특정 메서드와 매핑
value 속성에 요청받을 url을 적는다.

@RequestMapping(value = "/api/name")
public class NameController {
    @GetMapping("/hello")
    public String helloGet(...) {
        ...
    }
    @PostMapping("/hi")
    public String helloPost(...) {
        ...
    }
}

=> /api/name/helloGET 요청을 보내면 helloGet()이 실행된다.
=> /api/name/hiPOST 요청을 보내면 helloPost()가 실행된다.

3. Constructor (생성자)

- ❓생성자란❓

생성자는 new 연산자를 통해서 인스턴스를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메소드이다. 생성자를 선언할 때는 그 생성자를 정의하는 클래스의 이름과 동일하게 적어야 한다.

public class ConstructorEx01 {
	public ConstructorEx01(){ 
		System.out.println("호출되는 생성자");
	}
	public static void main(String[] args) {
		ConstructorEx01 ce = new ConstructorEx01(); // 생성자 호출
	}
}

즉, 스프링 프로젝트에서는

// service
public class ServiceEx01 {
    private final RepositoryEx01 re;
    public ServiceEx01(RepositoryEx01 re) {
        this.re = re;
    }
}

// controller
public class ControllerEx01 {
    private final ServiceEx01 se;
    public ControllerEx01(ServiceEx01 se) {
        this.se = se;
    }
}

이런식으로 service에도 controller에도 domain에도 생성자가 있어야하는데, 일일이 쓰기 귀찮으니까 아래 어노테이션으로 띵까먹겠다~ 이말이다.

- @{No/All/Required} ArgsConstructor

  • @NoArgsConstructor : 파라미터가 없는 "기본" 생성자
  • @AllArgsConstructor : 모든 필드 값을 파라미터로 받는 생성자
  • @RequiredArgsConstructor : final이나 @NonNull인 필드 값만 파라미터로 받는 생성자
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
public class User {
  private Long id;
  @NonNull
  private String username;
  @NonNull
  private String password;
  private int[] scores;
}
User user1 = new User(); // NoArgs (없음)
User user2 = new User("dale", "1234"); // RequiredArgs (일부만)
User user3 = new User(1L, "dale", "1234", null); // AllArgs (전체)

💡그러고 보니까 종자프로젝트할때 service에는 이 어노테이션을 써놔서 생성자코드 자체가 없는데도 controller에서 잘 가져다썼는데 controller에는 어노테이션을 안써서 생성자 코드를 하나하나 썼었다.

사용하는 service가 많아질때마다 controller 생성자를 고쳐줘야해서 귀찮았는데 얘도 어노테이션을 썼었다면 굳이 하나하나 고칠 필요 없이 알아서 바꼈을거라는거지...

- @Builder

필드가 여러개인 복잡한 클래스일때, 즉 생성자가 너무 많을 때 빌더를 사용한다.

기본 생성자(@NoArgsConstructor)가 필요한 상태에서 @Builder를 사용하고 싶다면 @NoArgsContructor, @AllArgsConstructor, @Builder를 모두 사용해야 에러가 발생하지 않는다.

@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Seed { 
	// ...(생략)...
    }

그 이유는 @Builder는 단독으로 쓰면 전체 생성자를 자동으로 만드는데, 다른 생성자가 있으면 별도로 전체 생성자를 만들어주어야하기 때문이다.

4. 로그 남기기

- @Slf4j

클래스 위에 @Slf4j를 붙이면 로그를 남길 수 있다.

@Controller
@Slf4j
public class TestController {
    @GetMapping("/")
    public String String(String str){
        try {
            str.toString();
        } catch (NullPointerException e){
            log.trace("가장 디테일한 로그");
            log.warn("경고");
            log.info("정보성 로그");
            log.debug("디버깅용 로그");
            log.error("에러",e);
        }
        return "test";
    }
}

Reference

[자바] 자주 사용되는 Lombok 어노테이션
[Spring] @RequiredArgsConstructor 어노테이션을 사용한 "생성자 주입"
[Spring] @Builder를 사용할 때 고려해야 할 생성자 문제 알아보기

profile
일기장같은 공부기록📝

0개의 댓글