@RequiredArgsConstructor
생성자 자동 생성을 단순화하는 데 사용
final
로 선언된 필드 또는 @NonNull
어노테이션이 지정된 필드를 기반으로 생성자를 생성@Autowired
@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)@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
Controller
@RestController
@Controller
+ @ResponsBody
@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
@Controller
public class MyController {
@GetMapping("/page")
public String getPage() {
// HTML 페이지를 반환
return "myPage";
}
}
@ResponseBody
@RequsetMapping
@GetMapping, @PostMapping ...
RequestMapping 어노테이션은 HTTP method의 get, post 와 같은 매서드 정보를 명시해줘야 했는데, GetMapping은 RequestMapping을 Get Method 요청으로 받고 처리하겠다는 뜻의 어노테이션이다.
// 아래 두 방법은 같은 동작을 한다.
@RequestMapping(value = "/someGetPage", method = RequestMethod.GET)
@GetMapping("/someGetPage")
Request Body, Param
@RequestBody
public ResponseEntity<User> createUser(@RequestBody User user) {
1. 클라이언트가 보낸 JSON 데이터를 User 객체로 자동 변환
2. user 객체를 사용하여 사용자 생성 및 저장 로직을 수행
3. ResponseEntity를 통해 응답을 반환
@RequestParam
(
@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는 자바 클래스를 스프링 빈으로 등록하라고 알리는 용도이다. 이 어노테이션을 사용하면 컴포넌트 스캔의 대상이 되어 어플리케이션 컨텍스트에 스프링 빈으로 등록된다.
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 통신의 헤더값들을 전달받을 수 있다.
서블릿에서 사용했던 HttpServletRequest
, HttpServletResponse
뿐만 아니라 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) { ... }
하지만 HttpServletRequest
와 같은 클래스 파라미터들은 @ModelAttribute로 인식하지 않는다. 그 이유는 Argument resolver로 지정해둔 클래스 타입이기 때문이다.