@어노테이션 정리

알비레오·2024년 10월 30일

자바

목록 보기
4/17

@Controller
스프링 부트의 컨트롤러

@GetMapping
요청된 URL과의 매핑을 담당
브라우저가 URL을 요청하면 스프링부트는 요청 페이지와 매핑되는 메서드를 찾아 실행한다.

@ResponseBody
URL 요청에 대한 응답으로 문자열을 리턴한다.
이 애너테이션을 생략하면 return에 해당하는 템플릿 파일을 찾게 된다.

@Entity
스프링부트가 해당 클래스를 엔티티로 인식한다.

@Getter
롬복의 애너테이션으로 Getter 메서드를 자동으로 생성한다.

@Setter
롬복의 애너테이션으로 Setter 메서드를 자동으로 생성한다.

@Id
id 속성을 기본키로 지정한다.

@GeneratedValue
데이터를 저장할 때 해당 속성에 값을 일일이 입력하지 않아도 자동으로 1씩 증가하여 저장한다.
@GeneratedValue(strategy = GenerationType.IDENTITY)
에서 strategy = GenerationType.IDENTITY는 고유한 번호를 생성하는 방법을 지정하는 부분으로 해당 속성만 별도로 번호가 차례대로 늘어나도록 할 때 사용한다.
strategy 옵션을 생략한다면 @GeneratedValue 애너테이션이 지정된 모든 속성에 번호를 차례로 생성만으로 순서가 일정한 고유 번호를 가질 수 없게 된다.

@Column
엔티티의 속성은 테이블의 열 이름과 일치하는데 열의 세부 설정을 위해 @Column 애너테이션을 사용한다.
@Column(length = 200) 이런 식으로 length는 열의 길이를 설정할 때 사용한다.
@Column(columnDefinition = "TEXT") 에서 columnDefinition은 열 데이터의 유형이나 성격을 정의할 때 사용한다.
이 경우 TEXT로 설정하였는데, 글자 수를 제한할 수 없는 경우에 이를 사용한다.
@Column(unique=true)에서 unique=true는 유일한 값만 저장할 수 있음을 의미한다. 즉, 값을 중복되게 저장할 수 없음을 말한다.

@Transient
엔티티의 속성은 @Column을 사용하지 않더라도 테이블의 열로 인식하는데, 테이블의 열로 인식하고 싶지 않을때 @Transient를 사용한다.
이는 엔티티의 속성을 테이블의 열로 만들지 않고 클래스의 속성 기능으로만 사용하고자 할 때 쓴다.

@ManyToOne
N:1의 관계를 나타낼 때 사용한다.
실제 데이터베이스에서는 외래키(foreign key) 관계가 생성된다.
옵션으로 fetch=FetchType.LAZY 혹은 fetch=FetchType.EAGER 처럼 데이터를 가져오는 설정을 할 수 있는데,
필요한 시점에 데이터를 가져오는 방식을 지연(Lazy) 방식이라고 하며,
이와 반대로 객체를 조회할 때 미리 리스트를 모두 가져오는 방식을 즉시(Eager) 방식이라고 한다.

@OneToMany
1:N의 관계를 나타낼 때 사용한다.

@SpringBootTest
해당 클래스가 테스트 클래스임을 의미한다.

@Autowired
스프링의 의존성 주입(DI)라는 기능을 사용하여 객체에 주입한다.
스프링의 의존성 주입(DI, Dependency Injection)이란 스프링이 객체를 대신 생성하여 주입하는 기법을 말한다.
속성(field), setter 메서드, 생성자(constructor)에서 사용하며 Type에 따라 알아서 Bean을 주입해준다.

@Test
해당 메서드가 테스트 메서드임을 나타낸다.

@Transactional
메서드가 종료될 때까지 DB 세션을 유지시킨다.

@RequiredArgsConstructor
롬복이 제공하는 에너테이션으로 final이 붙은 속성 혹은 @NonNull인 필드 값만 파라미터로 받는 생성자를 자동으로 만들어준다.

@Service
스프링 부트는 해당 클래스를 서비스로 인식시킨다.

@PathVariable
요청한 URL의 id 값을 얻을때 사용한다.

@RequestMapping
URL의 프리픽스(prefix) 설정을 위해 사용한다.

@PostMapping
GetMapping과 동일하게 URL 매핑을 담당하는 역할을 하지만 POST 요청을 처리하는 경우에 사용한다.

Spring Boot Validation 라이브러리

@Size
문자 길이를 제한한다.

@NotNull
Null을 허용하지 않는다.

@NotEmpty
Null 또는 빈 문자열("")을 허용하지 않는다.

@Past
과거 날짜만 입력할 수 있다.

@Future
미래 날짜만 입력할 수 있다.

@FutureOrPresent
미래 또는 오늘 날짜만 입력할 수 있다.

@Max
최댓값 이하의 값만 입력할 수 있도록 제한한다.

@Min
최솟값 이상의 값만 입력할 수 있도록 제한한다.

@Pattern
입력값을 정규식 패턴으로 검증한다.

@Valid

@PostMapping("/create")
    public String questionCreate(@Valid QuestionForm questionForm, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "question_form";
        }
        this.questionService.create(questionForm.getSubject(), questionForm.getContent());
        return "redirect:/question/list";
    }

QuestionForm의 @NotEmpty, @Size 등으로 설정한 검증 기능이 동작한다.
그리고 이어지는 BindingResult 매개변수는 @Valid으로 검증이 수행된 결과를 의미하는 객체이다.
BindingResult 매개변수는 항상 @Valid 바로 뒤에 위치해야하며, 만약 두 매개변수의 위치가 정확하지 않다면, @Valid만 적용되어 입력값 검증 실패 시 400 오류가 발생한다.

@RequestParam

@GetMapping("/list")
    public String list(Model model, @RequestParam(value="page", defaultValue="0") int page) {
        Page<Question> paging = this.questionService.getList(page);
        model.addAttribute("paging", paging);
        return "question_list";
    }

http://localhost:8080/question/list?page=0와 같이 GET 방식으로 요청된 URL에서 page값을 가져오기 위해 list 메서드의 매개변수로 @RequestParam(value="page", defaultValue="0") int page가 사용된다.
URL에 매개변수로 page가 전달되지 않은 경우 defaultValue="0"를 통해 기본값은 0이 되도록 설정한다.

@Configuration
이 파일이 스프링의 환경설정 파일임을 의미하는 애너테이션이다.

@EnableWebSecurity
모든 요청 URL이 스프링 시큐리티의 제어를 받도록 만드는 애너테이션이다.
이 애너테이션을 사용하면 스프링 시큐리티를 활성화하는 역할을 한다.

@Bean
자바 코드 내에서 별도로 빈을 정의하고 등록할 수 있다.
빈(bean)은 스프링에 의해 생성 또는 관리되는 객체를 의미하며, 컨트롤러, 서비스, 리포지터리 등도 모두 빈에 해당한다.
개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만들려고 할때 사용되는 애너테이션이다.

@Email
해동 속성의 값이 이메일 형식과 일치하는지 검증할 때 쓰인다.

@PreAuthorize("isAuthenticated()")
해당 메서드는 로그인한 사용자만 호출한다.

@EnableMethodSecurity(prePostEnabled = true)

@Configuration
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
    (... 생략 ...)
}

prePostEnabled = true는 로그인 여부를 판별할 때 사용한 @PreAuthorize를 사용하기 위해 반드시 필요한 설정이다.

@Component
해당 클래스는 스프링 부트가 관리하는 빈으로 등록된다.


@RequestParam과 @PathVariable의 쓰임과 차이

  • 이 두개의 애너테이션은 URL을 통해 전달된 값을 파라미터로 받아오는 역할을 한다.
    URL을 통해 값을 전달하는 방식은 2가지가 있는데,
  1. http://localhost8080/article?page=1&listSize=10
  2. http://localhost8080/article/1

여기서 쿼리스트링을 사용하여 여러개의 값을 전달하는 1번 방식은 @RequestParam을 통해, 2번은 @PathVariable을 통해 받아올 수 있다.

즉, @PathVariable은 값을 하나만 받아올 때 사용하고, @RequestParam은 여러 개의 값을 받아올 때 사용한다.
또한 @RequestParam은 주로 GET 요청에서,
@PathVariable은 주로 POST 요청에서 사용한다.


@RestController와 @Controller의 차이

@RestController는 @Controller에 @ResponseBody가 붙어 별도의 애너테이션을 명시하지 않더라도 HTTP 응답데이터(body)에 자바 객체가 매핑되어 전달된다.


@RequestBody / ResponseBody 정리

@RequestBody
클라이언트 -> 서버
필요한 데이터를 요청하기 위해 JSON 데이터를 요청 본문에 담아서 서버로 보내면,
서버에서는 @RequestBody 애너테이션을 사용하여 HTTP 요청 본문에 담긴 값들을 자바객체로 변환시켜, 객체에 저장한다.
비동기 통신에서 쓰이는 Body 안의 데이터(JSON 객체)를 자바 객체(VO)로 변환해주는 애너테이션이다.

@ResponsBody
서버 -> 클라이언트
응답 데이터를 전송하기 위해 @ResponseBody 애너테이션을 사용하여 자바 객체를 HTTP 응답 본문의 객체로 변환하여 클라이언트로 전송한다.
보내려는 자바 객체(VO)를 데이터(JSON객체)로 바꿔 Body 안에 넣어주는 애너테이션이다.


@NotNull / @NotEmpty / @NotBlank 차이

@NotNull
Null만 허용하지 않음
""이나 " "는 허용함

@NotEmpty
Null과 "" 둘 다 허용하지 않음
@NotNull에 "" validation이 추가된 것

@NotBlank
Null과 "", " " 모두 허용하지 않음
@NotEmpty에 " " validation이 추가된 것


@NoArgsConstructor
기본 생성자를 자동으로 추가한다.

@AllArgsConstructor
모든 필드 값을 파라미터로 받는 생성자를 추가한다.

@ToString
class 내 모든 필드의 toString method를 자동 생성한다.

@Data
이 애너테이션은 @Getter/@Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor를 합쳐 놓은 애너테이션이다.

0개의 댓글