@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으로 만들려고 할때 사용되는 애너테이션이다.
해동 속성의 값이 이메일 형식과 일치하는지 검증할 때 쓰인다.
@PreAuthorize("isAuthenticated()")
해당 메서드는 로그인한 사용자만 호출한다.
@EnableMethodSecurity(prePostEnabled = true)
@Configuration @EnableWebSecurity @EnableMethodSecurity(prePostEnabled = true) public class SecurityConfig { (... 생략 ...) }prePostEnabled = true는 로그인 여부를 판별할 때 사용한 @PreAuthorize를 사용하기 위해 반드시 필요한 설정이다.
@Component
해당 클래스는 스프링 부트가 관리하는 빈으로 등록된다.
@RequestParam과 @PathVariable의 쓰임과 차이
- 이 두개의 애너테이션은 URL을 통해 전달된 값을 파라미터로 받아오는 역할을 한다.
URL을 통해 값을 전달하는 방식은 2가지가 있는데,여기서 쿼리스트링을 사용하여 여러개의 값을 전달하는 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를 합쳐 놓은 애너테이션이다.