자주 쓰는 Lombok 어노테이션을 정리햅오자.
스프링 빈으로 자동 등록해주는 역할인 @Controller
, @Service
, @Repository
는 제외!
❓
@RestController
는❓
"@RestController
=@Controller
+@ResponseBody
"
즉, JSON 형태로 객체 데이터를 반환한다.
@RestController
를 쓰면 이 안에 있는 모든 컨트롤러가 JSON 형태의 객체 데이터를 반환해야 하기 때문에, 그 안에 반환값이 다른 컨트롤러도 만들고싶다면@Controller
를 쓰고 JSON으로 반환할 컨트롤러에만 따로@ResponseBody
를 붙여주면 된다.
: 접근자, 설정자 자동 생성
xxx
라는 필드를 선언하면 자동으로 getXxx()
와 setXxx()
메소드를 생성한다.
@Getter @Setter
private String name;
=> user.setName("홍길동");
이나 user.getName();
을 쓸 수 있다.
@Entity
: JPA에서 사용할 엔티티
name 속성에 JPA에서 사용할 엔티티 이름을 지정하는데, 아무것도 안쓰면 기본값으로 클래스 이름을 쓴다.
@Table
: 해당 엔티티와 매핑할 테이블
name 속성에 매핑할 테이블 이름을 지정하는데, 기본값은 엔티티 이름이다.
@Entity
@Table(name = "name")
public class Name { ...(생략)...}
=> Name
이라는 엔티티는 name
이라는 테이블에 매핑된다.
@Id
: 해당 필드를 테이블의 기본 키(PK)에 매핑@Id
만 사용할 경우 기본 키를 직접 할당해 주어야 하는데, 기본 키를 직접 할당하는 대신 데이터베이스가 생성해주는 값을 사용하려면 @GeneratedValue
를 사용해야한다.@GeneratedValue
: 기본 키를 자동으로 생성strategy = GenerationType.IDENTITY
속성을 쓰는데, 이는 기본 키 생성을 데이터베이스에 위임한다는 뜻이다.❗
@GeneratedValue(strategy = GenerationType.IDENTITY)
를 붙이면 API 테스트 할때 굳이 id까지 넣어주지 않아도 알아서1
,2
,3
,... 으로 만든다~!
@Column
: 해당 필드를 테이블 컬럼에 매핑❗🤔Entity 클래스에 정의된 모든 내부 변수는 기본적으로
@Column
을 포함하고 있기 때문에 별다른 옵션을 지정하지 않는다면 생략할 수 있다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
=> id
필드를 pk로 쓸 것이고, 기본키 생성은 데이터베이스에 위임할 것이며, name
필드는 테이블의 컬럼이 될 것인데, null값을 허용하지 않겠다는 뜻이다.
이 외에도
@OneToMany
나@ManyToOne
등 다양한 연관관계를 매핑할수도 있다.
: 들어온 요청을 특정 메서드와 매핑
value 속성에 요청받을 url을 적는다.
@RequestMapping(value = "/api/name")
public class NameController {
@GetMapping("/hello")
public String helloGet(...) {
...
}
@PostMapping("/hi")
public String helloPost(...) {
...
}
}
=> /api/name/hello
로 GET
요청을 보내면 helloGet()
이 실행된다.
=> /api/name/hi
로 POST
요청을 보내면 helloPost()
가 실행된다.
생성자는 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에도 생성자가 있어야하는데, 일일이 쓰기 귀찮으니까 아래 어노테이션으로 띵까먹겠다~ 이말이다.
@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 생성자를 고쳐줘야해서 귀찮았는데 얘도 어노테이션을 썼었다면 굳이 하나하나 고칠 필요 없이 알아서 바꼈을거라는거지...
필드가 여러개인 복잡한 클래스일때, 즉 생성자가 너무 많을 때 빌더를 사용한다.
기본 생성자(@NoArgsConstructor
)가 필요한 상태에서 @Builder
를 사용하고 싶다면 @NoArgsContructor
, @AllArgsConstructor
, @Builder
를 모두 사용해야 에러가 발생하지 않는다.
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Seed {
// ...(생략)...
}
그 이유는 @Builder
는 단독으로 쓰면 전체 생성자를 자동으로 만드는데, 다른 생성자가 있으면 별도로 전체 생성자를 만들어주어야하기 때문이다.
클래스 위에 @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";
}
}
[자바] 자주 사용되는 Lombok 어노테이션
[Spring] @RequiredArgsConstructor 어노테이션을 사용한 "생성자 주입"
[Spring] @Builder를 사용할 때 고려해야 할 생성자 문제 알아보기