기본 어노테이션(annotation) 🍥

jiji·2023년 11월 2일
0

Spring Boot Project 🌱

목록 보기
7/16

@RequiredArgsConstructor

생성자 자동 생성을 단순화하는 데 사용

  • 클래스의 필드 중 final로 선언된 필드 또는 @NonNull 어노테이션이 지정된 필드를 기반으로 생성자를 생성

@Autowired

  • 빈(Bean) 간의 의존성 주입(Dependency Injection)을 자동화하는 데 도움을 주는 기능
  • @RequiredArgsConstructor 사용시 Lombok이 생성자 인젝션을 처리하고 필드에 대한 의존성을 자동으로 수행한다.
  • 주로 생성자, 메서드, 필드에 사용
@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // UserService의 나머지 메서드들
}

UserService 생성자를 호출할 때 UserRepository 빈을 주입해줍니다


📍 Entity

@Entity

JPA 엔티티로 지정

@Data

Lombok 어노테이션 - @Getter, @Setter, @ToString, @EqualsAndHashCode를 포함

@Getter , @Setter

Lombok 자동으로 자바 get method와 set method를 등록해준다. 이 어노테이션을 사용하면 클래스 내의 getter, setter 매서드의 코드를 줄일 수 있어 가독성을 높일 수 있다.

@GeneratedValue : 자동 증가(auto-increment)

  • JPA에서 사용하는 방식
  • 데이터베이스에서 자동으로 증가하는 기본 키(primary key) 값을 생성하도록 지정하는 것
@GeneratedValue(strategy = GenerationType.IDENTITY)

@Column

  • name : "테이블에서 해당 열의 이름"
  • nullable : false - Null 허용 안함

📍 Controller

@RestController

@Controller + @ResponsBody

  • REST API를 제공하는 controller를 위한 어노테이션이다.
  • 기존의 Controller 어노테이션의 Return 값에 ResponseBody를 적용한 것으로 json으로 결과를 반환 (html view 형식이 아닌)
  • 기존의 Controller는 View(화면)을 리턴하고 json 형태의 데이터를 반환할 때 @ResponseBody를 추가해줘야 했는데 이러한 기능을 통합시킨 어노테이션이다.
  • 주로 RESTful API 엔드포인트를 정의하고 JSON 또는 XML과 같은 데이터 형식으로 응답을 생성할 때 사용
  • 각 메서드의 반환 값이 HTTP 응답의 본문으로 직접 전송된다는 것을 나타냅니다. 따라서, 메서드에서 반환되는 객체는 JSON, XML, HTML 또는 다른 형식의 데이터로 직렬화되어 클라이언트에게 전달됩니다.
@RestController
public class MyRestController {
    @GetMapping("/api/resource")
    public MyResource getResource() {
        // 반환 값이 JSON 또는 XML로 직렬화되어 클라이언트에게 반환됨
        return new MyResource();
    }
}

@GetMapping("/example/{id}")
public ResponseEntity<String> getExampleData(@PathVariable Long id) {
	// 가정적인 데이터 생성
    String responseData = "Data for ID " + id;

	// ResponseEntity를 사용하여 HTTP 응답을 생성
    return ResponseEntity.ok(responseData);
}

@Controller

  • MVC 패턴의 Controller 클래스임을 명시
  • 해당 클래스에서 URL 매핑 된 메소드들은 리턴 값으로 viewName(String)을 반환한다.
  • ViewResolver를 통해 viewName에 맞는 뷰를 클라이언트에게 제공한다.
  • 주로 전통적인 웹 애플리케이션에서 사용되며, HTML 뷰를 생성하고 반환하기 위해 주로 사용
@Controller
public class MyController {
    @GetMapping("/page")
    public String getPage() {
        // HTML 페이지를 반환
        return "myPage";
    }
}

@ResponseBody

  • @Controller로 지정된 클래스 내에서 비즈니스 로직을 처리하는 메소드 중, 클라이언트에게 뷰가 아닌 데이터(Json)를 전송하고 싶을 때 사용.
  • 컨트롤러 메서드에서 반환되는 값이 HTTP 응답 본문으로 직접 전송되도록 지정하는 데 사용
  1. 직렬화된 데이터 반환: 메서드가 @ResponseBody 어노테이션과 함께 사용될 때, 메서드에서 반환되는 객체는 클라이언트에게 직렬화된 형식으로 전송됩니다. 일반적으로 이는 JSON 또는 XML로 직렬화된 데이터를 의미합니다.
  2. HTTP 응답 본문: 메서드가 반환하는 값은 HTTP 응답의 본문에 직접 배치됩니다. 클라이언트는 이 데이터를 읽고 처리할 수 있습니다.
  • 스프링의 DI 방식에는 크게 3가지가 있는데, Field Injection, Setter Injection, Constructor Injection이 있다. 이 중에 가장 올바른 방법으로 생각되는 것은 생성자를 통한 주입 방법이다. 단 하나의 생성자만 있다면 자동으로 의존성 주입까지 해주게 되어 코드의 가독성을 높일 수 있다.

@RequsetMapping

  • 요청된 URL을 어떤 매서드가 처리할지 결정하는 어노테이션이다.
    - = 요청(URL)을 컨트롤러의 메서드와 매핑할 때 사용.
  • Controller 어노테이션이 클래스 위에 선언되었다면 RequestMapping은 클래스 내의 메서드 위에도 선언될 수 있다.
    - 메소드 뿐만 아니라 클래스 레벨에서도 사용이 가능하다.

@GetMapping, @PostMapping ...

RequestMapping 어노테이션은 HTTP method의 get, post 와 같은 매서드 정보를 명시해줘야 했는데, GetMapping은 RequestMapping을 Get Method 요청으로 받고 처리하겠다는 뜻의 어노테이션이다.

// 아래 두 방법은 같은 동작을 한다.
@RequestMapping(value = "/someGetPage", method = RequestMethod.GET)

@GetMapping("/someGetPage")

Request Body, Param

@RequestBody

  • HTTP 요청의 본문(body)에 포함된 데이터를 자바 객체로 바인딩하는데 사용
  • 주로 컨트롤러 메서드의 매개변수에 적용하여 클라이언트가 보낸 요청 본문의 데이터를 자동으로 파싱하고 해당 메서드에서 사용할 수 있도록 도와줍니다.
public ResponseEntity<User> createUser(@RequestBody User user) {

1. 클라이언트가 보낸 JSON 데이터를 User 객체로 자동 변환
2. user 객체를 사용하여 사용자 생성 및 저장 로직을 수행
3. ResponseEntity를 통해 응답을 반환

@RequestParam

  • HTTP 요청 파라미터를 쉽게 받을 수 있는 어노테이션이다.
  • 위의 @RequestHeader와 동일한 파라미터 값들을 지원한다
(
	@RequestParam(value = "id", defaultValue = "guest") String id,
    @RequestParam("pw") int password
 )

@RequestParam은 생략이 가능하다.

  • 파라미터의 value name과 값을 저장할 변수 이름이 같은 경우
  • int, Integer, String과 같은 단순타입 인 경우
(
	@RequestParam(defaultValue = "guest") String id, 
    int password
)
  • required=false 요청 파라미터가 선택적으로 전달(요청 파라미터가 없어도 핸들러 메서드가 호출된다)

  • 만약 HTTP 요청에서의 파라미터 값이 공백(“”) 이라면?
    http://localhost:8080/params?username=
    username의 파라미터에는 "" 공백데이터로 인식되어 정상 작동 한다.

❗ "" 와 null은 다르다! 한가지 예방법으로는 defaultValue 값을 설정해주면 된다.

	@RequestParam(defaultValue="guest") String id
    // HTTP 요청시 username = "guest"

기타

@Component

Component는 자바 클래스를 스프링 빈으로 등록하라고 알리는 용도이다. 이 어노테이션을 사용하면 컴포넌트 스캔의 대상이 되어 어플리케이션 컨텍스트에 스프링 빈으로 등록된다.

@Service

Service는 @Component를 상속한 어노테이션으로 ComponentScan의 대상이 되어 런타임 시에 스프링 빈으로 등록된다. 이외에 다른 특별한 기능은 없지만, 이 어노테이션을 본다면 이것이 서비스 레이어로 비즈니스 로직이 작성되어 있는 구간이라고 빠르게 알 수 있을 것이다.

@Service("Bean 등록 시 이름, 생략 가능")

@Configuration

설정 정보 또는 외부 라이브러리를 빈으로 등록해서 사용해야 한다면 직접 Config 클래스를 만들어 Configuration과 Bean 어노테이션을 명시해 빈으로 등록해야 하는데 이때 사용된다.

@SpringBootApplication

SpringBootApplication 어노테이션은 스프링 부트의 동작에서 가장 핵심적인 어노테이션이다. 모두 중요한 기능이겠지만 가장 중요하다고 생각하는 ComponentScan과 EnableAutoConfiguration을 알아보자.

스프링부트는 빈을 2번 등록한다. 처음에 컴포넌트 스캔으로 등록하고, 이후에 EnableAutoConfiguration을 통해 추가적인 Bean 정보를 읽어 들인다.

ComponentScan은 위에서 설명한 Controller, Component, Service와 같은 어노테이션을 빈으로 등록하는 기능을 수행한다. 컴포넌트 스캔의 시작 지점은 현재 위치의 하위 디렉터리인 것을 명심하자

EnableAutoConfiguration은 Configuration 설정 파일을 자동으로 읽어들여 Bean을 등록한다. spirng.factories라는 내부에 여러 개의 Configuartion 들을, 조건에 따라 빈으로 등록한다고 한다! 이 정도만 알고 있으면 될 것 같다. 즉 스프링부트는 EanbleAutoConfiguation을 통해 수많은 자동 설정을 지원해주고 우리는 쉽게 스프링 프레임워크를 사용할 수 있는 것이다.

@Builder
빌더 패턴을 사용할 때 사용하는 어노테이션이다. 다수의 필드를 가지는 복잡한 클래스의 경우 생성자를 사용할 때, 순서를 헷갈려서 에러가 날 수도 있다. 이럴 때 컴파일 에러가 뜨지 않는다면 추후에 에러가 났을 때 찾기 힘들 수도 있으니 빌더를 사용하여 클래스를 생성할 수 있는데, 빌더 패턴을 직접 사용하면 코딩량이 상당하다고 한다. 저는 사용 안 해봤지만.. 그래서 빌더 어노테이션을 사용하면 자동으로 추가해줘서 편리한 장점이 있다고 한다.


Mapping된 메소드에 파라미터로 HTTP 통신의 헤더값들을 전달받을 수 있다.

서블릿에서 사용했던 HttpServletRequestHttpServletResponse 뿐만 아니라 HTTP 통신 메소드를 정의하는 HttpMethod, 클라이언트의 locale 정보를 담는 Locale 처럼 스프링에서 제공하는 클래스들 말고도 아래처럼 어노테이션 형식의 파라미터를 지원한다.

`@RequestMapping("/headers")
public String getHeadersWithAnnotations(
HttpServletRequest req,
HttpServletResponse resp,
// GET, POST, PATCH, etc..
HttpMethod httpMethod,
// ko_KR
Locale locale,
// 헤더 정보 모두 가져오기
// MultiValueMap<K, V>: 하나의 key에 여러 value를 받을 수 있다!
@RequestHeader MultiValueMap<String, String> headerMap,
// 특정 헤더값 가져오기
@RequestHeader("host") String host,
// 쿠키
@CookieValue(value = "someCookie", required = false) String cookie) {

/*
* some logic...
*/

return "";

}`

어노테이션의 파라미터들에 대해 자세하게 알아보면 다음과 같다.

`@RequestHeader(
// header의 이름을 명시한다. 아래 name의 별칭이다.
String value,

// value 와 같은 기능
String name,  

// header 값의 필요 여부, true 일 경우 헤더 값이 존재하지 않으면 exception 발생
boolean required, 

// required=false 일 때 헤더 값이 존재하지 않는 경우 기본 값을 설정해줌
String defaultValue
)`

요청 파라미터의 값들을 통해 객체를 만들때 하나하나 파라미터값을 불러오지 않아도 @ModelAttribute를 이용하여 객체 생성을 자동화할 수 있다.

`class SomeClass {
private String someData;

/*
* Getter & Setter
*/

}

@Controller
public class ModelAttributeTestClass {

@RequestMapping("/model-attribute")
public String makeModel(@ModelAttribute SomeClass someInstance) {
/*
some logic...
/
return "";
}`

@RequestParam과 동일하게 어노테이션 생략이 가능하다.

public String makeModel(SomeClass someInstance) { ... }

  • 생략된 @RequestParam과 @ModelAttribute는 어떻게 구분될까?
    1. 단순 타입(int, Integer, String, etc)의 경우 @RequestParam
    2. 단순 타입을 제외한 나머지 클래스의 경우 @ModelAttribute

하지만 HttpServletRequest와 같은 클래스 파라미터들은 @ModelAttribute로 인식하지 않는다. 그 이유는 Argument resolver로 지정해둔 클래스 타입이기 때문이다.

0개의 댓글