
SpringBoot 프로젝트를 만들다 보면 여러가지 어노테이션을 자연스럽게 쓰게 된다.
@NoArgsConstructor / @Getter / @Entity ..
대충 알고 넘어가거나 썼었던 어노테이션에 대해 정리하기 위해 공부해보았다.
Lombok은 뭐고 Annotation은 뭘까?
그렇다면 실제 사용은 어떻게 할까?
//Lombok
compileOnly 'org.projectlombok:lombok:1.18.30'
annotationProcessor 'org.projectlombok:lombok:1.18.30' @Entity
@Getter
@Setter
@Builder
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@SQLDelete(sql = "UPDATE post SET deleted_at = NOW() where id=?")
@SQLRestriction("deleted_at is NULL")
public class Post{
...
}
SpringBoot를 자동으로 실행시켜주는 중요한 어노테이션입니다.
제일 기본적인 어노테이션이며 안에는 추가적으로 설정된 어노테이션들이 있습니다.

# SpringBootApplication 내부
그 중 눈여겨 볼만한 어노테이션은

# Spring 프로젝트의 메인이 짧은 이유
위에서 SpringBoot는 Bean을 통해서 이루어졌다고 했는데, Bean이란 무엇일까요?
Spring IoC 컨테이너에 의해 인스턴스화되어 조립되거나 관리되는 자바 객체를 빈(Bean)이라고 부릅니다.
SpringBoot는 객체가 직접 new를 이용해서 생성하는게 아니라 Spring에 의해 생성되고 관리됩니다.
그렇다면 Bean 등록은 어떤 방식이 있는지 알아보겠습니다.
Spring 프로젝트에서 쉽게 찾아볼 수 있는 @Controller 어노테이션이 있습니다.
이 어노테이션을 선언한 후 Ctrl키를 눌러 안을 살펴보면 @Component 어노테이션을 찾아볼 수 있습니다.

# @Component 어노테이션으로 인하여 Spring은 해당 Controller를 Bean으로 등록하게 됩니다.
사실 이 방법은 사용해보지는 않았습니다
@Configuration : 스프링 IoC Container에게 해당 클래스가 Bean 구성 Class임을 알려주는 어노테이션입니다.
@Bean을 해당 클래스의 메소드에 적용하면 @Autowired로 빈을 부를 수 있습니다.
@Configuration
public class Sample {
@Bean
public SampleController sampleController() {
return new SampleController;
}
}
Spring의 Controller를 의미합니다. Spring MVC에서 Controller 클래스에 쓰입니다.
웹 요청의 기준을 담당합니다.
Controller 중 View로 응답하지 않는 Controller 입니다.
Method의 반환 결과를 JSON 형태로 반환합니다.
이 어노테이션이 적혀있는 Controller의 method는 HttpResponse로 바로 응답이 가능합니다.
@ResponseBody 역할을 자동적으로 해주는 Annotation입니다.
즉, @RestController = @Controller + @ResponseBody
Spring의 Service Class에 쓰입니다.
구현부라고 생각하면 되며, 비즈니스 로직을 수행하는 Class라는걸 나타내는 용도입니다.
Spring의 데이터 액세스 계층의 구성 요소를 나타내는 데 사용됩니다.
주로 DAO(Data Access Object - DB에 접근) 클래스에 적용됩니다.
Controller나 Controller의 method에 적용되는 어노테이션이며
@Controller
@RequestMapping("/example")
public class ExampleController {
@RequestMapping(method = RequestMethod.GET)
public String getExamplePage() {
return "examplePage";
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String getExampleById(@PathVariable("id") Long id) {
// handle GET request for "/example/{id}"
return "exampleDetails";
}
@RequestMapping(value = "/submit", method = RequestMethod.POST)
public String submitExampleForm(@RequestParam("name") String name, @RequestParam("age") int age) {
// handle POST request for "/example/submit"
return "submitted";
}
}
위 예시와 같이
HTTP 메서드(GET, POST, PUT, DELETE 등) / 경로 변수(Path Variables) / 파라미터(params) / 헤더(headers)
에 대한 요청을 매핑할 수 있습니다.
Spring MVC 컨트롤러 메서드에서 해당 메서드가 반환하는 객체를 HTTP 응답의 본문(body)으로 직접 전송하도록 지시하는 어노테이션입니다.
@Entity는 JPA(Java Persistence API)에서 관리되는 엔티티 클래스를 정의할 때 사용됩니다.
엔티티 클래스는 데이터베이스의 테이블과 매핑되는 자바 객체를 나타내며, 데이터베이스와의 상호 작용을 담당합니다.
@Entity를 사용하여 클래스를 엔티티로 지정하면, 해당 클래스의 객체가 JPA에서 관리되는 영속성 엔티티가 되며,
데이터베이스의 테이블과 매핑됩니다. 이를 통해 객체 지향 애플리케이션과 관계형 데이터베이스 간의 매핑을 수행할 수 있습니다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
}
@NoArgsConstructor : 기본 생성자를 자동으로 추가합니다.
@NoArgsConstructor(access = AccessLevel.PROTECTED) : 기본생성자의 접근 권한을 protected로 제한할 수도 있습니다.
Entity Class를 프로젝트 코드상에서 기본생성자로 생성하는 것은 금지하고, JPA에서 Entity 클래스를 생성하도록 허용하기 위해 사용한다.
@AllArgsConstructor : 모든 필드 값을 파라미터로 받는 생성자를 추가합니다.
@RequiredArgsConstructor : final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 추가합니다.
@Getter : Class 내 모든 필드의 Getter 메소드를 자동 생성해줍니다.
@Setter : Class 내 모든 필드의 Setter 메소드를 자동 생성해줍니다.
맨 위 사용 예시에서 나타나는 어노테이션들입니다.
이 밖에도 다양한 어노테이션들이 있고, Spring 프로젝트에 기본이 되는 개념이기 때문에 필요할 때 적재적소에 활용할 수 있어야 할 수 있어야 합니다.