반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 자바
- 이펙티브자바
- 김영한
- 알고리즘정렬
- Effective Java 3
- effectivejava
- 엘라스틱서치
- 자바스크립트
- 스프링부트
- 알고리즘
- JavaScript
- 카카오 면접
- 카카오
- kubernetes
- 이차전지관련주
- 코딩테스트
- Effective Java
- Sort
- Spring
- 스프링
- 이펙티브 자바
- 스프링 핵심원리
- 오블완
- 클린아키텍처
- k8s
- 티스토리챌린지
- 예제로 배우는 스프링 입문
- 스프링핵심원리
- ElasticSearch
- java
Archives
- Today
- Total
Kim-Baek 개발자 이야기
[카카오 면접] 스프링의 여러 어노테이션 본문
카카오 면접을 준비하면서, 공부했던 내용을 정리해놓고 다시 기억하기 위한 포스팅
@Component
- component-scan을 선언에 의해 특정 패키지 안의 클래스들을 스캔하고, @Component Annotation이 있는 클래스에 대하여 bean 인스턴스를 생성한다.
@Controller, @Service, @Repository
- @Component —구체화—> @Controller, @Service, @Repository
- bean으로 등록
- 해당 클래스가 Controller/Service/Repository로 사용됨을 Spring Framework에 알린다.
@RequestMapping
@Controller
@RequestMapping("/home") // 1) Class Level
public class HomeController {
/* an HTTP GET for /home */
@RequestMapping(method = RequestMethod.GET) // 2) Handler Level
public String getAllEmployees(Model model) {
...
}
/* an HTTP POST for /home/employees */
@RequestMapping(value = "/employees", method = RequestMethod.POST)
public String addEmployee(Employee employee) {
...
}
}
- @RequestMapping에 대한 모든 매핑 정보는 Spring에서 제공하는 HandlerMapping Class가 가지고 있다.
- 1) Class Level Mapping
모든 메서드에 적용되는 경우
“/home”로 들어오는 모든 요청에 대한 처리를 해당 클래스에서 한다는 것을 의미한다. - 2) Handler Level Mapping
요청 url에 대해 해당 메서드에서 처리해야 되는 경우
“/home/employees” POST 요청에 대한 처리를 addEmployee()에서 한다는 것을 의미한다. - value: 해당 url로 요청이 들어오면 이 메서드가 수행된다.
- method: 요청 method를 명시한다. 없으면 모든 http method 형식에 대해 수행된다.
@RestController
- @Controller + @ResponseBody
- @ResponseBody를 모든 메소드에서 적용한다.
- 메소드의 반환 결과(문자열)를 JSON 형태로 반환한다.
- @Controller 와 @RestController 의 차이
- @Controller
- API와 view를 동시에 사용하는 경우에 사용
- 대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환한다.
- view(화면) return이 주목적
- @RestController
- view가 필요없는 API만 지원하는 서비스에서 사용 (Spring 4.0.1부터 제공)
- @RequestMapping 메서드가 기본적으로 @ResponseBody 의미를 가정한다.
- data(json, xml 등) return이 주목적
- 즉, @RestController = @Controller + @ResponseBody
- @Controller
@Required
- setter method에 사용한다.
- 영향을 받는 bean property 구성 시 XML 설정 파일에 반드시 property를 채워야 한다. (엄격한 체크)
- 그렇지 않으면 BeanInitializationException 예외를 발생
- 예시
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
@Autowired
- Type에 따라 알아서 Bean을 주입한다.
- 필드, 생성자, 입력 파라미터가 여러 개인 메소드(@Qualifier는 메소드의 파라미터)에 적용 가능
- Type을 먼저 확인한 후 못 찾으면 Name에 따라 주입한다.
- Name으로 강제하는 방법: @Qualifier을 같이 명시
- 예시
- TIP) Bean을 주입받는 방식 (3가지)
- @Autowired
- setter
- 생성자 (@AllArgsConstructor 사용) -> 권장방식
@Qualifier
- 같은 타입의 빈이 두 개 이상이 존재하는 경우에 스프링이 어떤 빈을 주입해야 할지 알 수 없어서 스프링 컨테이너를 초기화하는 과정에서 예외를 발생시킨다.
- 이 경우 @Qualifier을 @Autowired와 함께 사용하여 정확히 어떤 bean을 사용할지 지정하여 특정 의존 객체를 주입할 수 있도록 한다.
- 예시
- xml 설정에서 bean의 한정자 값(qualifier value)을 설정한다.
- @Autowired 어노테이션이 적용된 주입 대상에 @Qualifier 어노테이션을 설정한다.
@Resource
- javax.annotation.Resource
- 표준 자바(JSR-250 표준) Annotation으로, Spring Framework 2.5.* 부터 지원 가능한 Annotation이다.
- Annotation 사용으로 인해 특정 Framework에 종속적인 어플리케이션을 구성하지 않기 위해서는 @Resource를 사용할 것을 권장한다.
- @Resource를 사용하기 위해서는 class path 내에 jsr250-api.jar 파일을 추가해야 한다.
- 필드, 입력 파라미터가 한 개인 bean property setter method에 적용 가능
[Data Validation]
@Vaild
- import javax.validation.Valid;
- @Size(max=10, min=2, message=”errMsg”)
- @Email(message=”errMsg”)
- @NotEmpty(message=”errMsg”)
[Configuration]
@Configuration
@EnableWebSecurity
@SpringBootApplication
@EnableWebMvc
@RestControllerAdvice
@ExceptionHandler
@ResponseStatus
[Parameter를 받는 방법]
@RequestParam
- HTTP GET 요청에 대해 매칭되는 request parameter 값이 자동으로 들어간다.
- url 뒤에 붙는 parameter 값을 가져올 때 사용한다.
- Ex) ` http://localhost:8080/home?index=1&page=2`
@GetMapping("/home")
public String show(@RequestParam("page") int pageNum {
}
- 위의 경우 GET /home?index=1&page=2와 같이 uri가 전달될 때 page parameter를 받아온다.
- @RequestParam 어노테이션의 괄호 안의 문자열이 전달 인자 이름(실제 값을 표시)이다.
@PathVariable
- HTTP 요청에 대해 매칭되는 request parameter 값이 자동으로 들어간다.
- uri에서 각 구분자에 들어오는 값을 처리해야 할 때 사용한다.
- Ex) ` http://localhost:8080/index/1`
- REST API에서 값을 호출할 때 주로 많이 사용한다
@PostMapping("/index/{idx}")
@ResponseBody
public boolean deletePost(@PathVariable("idx") int postNum) {
return postService.deletePost(postNum);
}
- 위의 경우 POST /index/{idx} 같이 uri 가 전달될 때 해당하는 구분자 {idx}를 받아온다
- 참고 @RequestParam와 @PathVariable 동시 사용 예제
@GetMapping("/user/{userId}/invoices")
public List<Invoice> listUsersInvoices(@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
}
- 위의 경우 GET /user/{userId}invoices?date=190101 와 같이 uri가 전달될 때
- 구분자 {userId}는 @PathVariable(“userId”)로,
- 뒤에 이어붙은 parameter는 @RequestParam(“date”)로 받아온다.
@RequestBody
- 반드시 HTTP POST 요청에 대해서만 처리한다.
- HTTP POST 요청에 대해 request body에 있는 request message에서 값을 얻어와 매칭한다.
- RequestData를 바로 Model이나 클래스로 매핑한다.
- 이를테면 JSON 이나 XML같은 데이터를 적절한 messageConverter로 읽을 때 사용하거나 POJO 형태의 데이터 전체로 받는 경우에 사용한다.
@ModelAttribute
- @RequestParam과 비슷하다.
- form 값
[공용 생성일/수정일을 위한 Annotation]
@EnableJpaAuditing
- JPA Auditing을 활성화한다.
@MappedSuperclass
- JPA Entity 클래스들이 BaseTimeEntity을 상속할 경우 필드들(createdDate, modifiedDate)도 컬럼으로 인식하도록 한다.
@EntityListeners
- BaseTimeEntity 클래스에 Auditing 기능을 포함한다.
@CreatedDate
- Entity가 생성되어 저장될 때 시간이 자동으로 저장된다.
@LastModifiedDate
- 조회한 Entity의 값을 변경할 때 시간이 자동으로 저장된다.
@Transactional
- 메소드 내에서 Exception이 발생하면 해당 메소드에서 이루어진 모든 DB 작업을 초기화한다.
- 즉, save 메소드를 통해서 10개를 등록해야 하는데 5번째에서 Exception이 발생하면 앞에 저장된 4개 까지 모두 롤백한다.
- (정확히 얘기하면, 이미 넣은걸 롤백시키는건 아니며, 모든 처리가 정상적으로 됐을때만 DB에 커밋하며 그렇지 않은 경우엔 커밋하지 않는 것이다.)
- 비지니스 로직과 트랜잭션 관리는 모두 Service에서 관리한다.
- 따라서 일반적으로 DB 데이터를 등록/수정/삭제 하는 Service 메소드는 @Transactional를 필수적으로 가져간다.
[JPA에서 제공하는 Annotation]
- JPA를 사용하면 DB 데이터에 작업할 경우 실제 쿼리를 날리지 않고 Entity 클래스의 수정을 통해 작업한다.
@Table
- 엔티티 클래스에 매핑할 테이블 정보를 알려준다.
- Ex) @Table(name = "USER")
- 이 어노테이션을 생략하면 클래스 이름을 테이블 이름 정보로 매핑한다.
@Entity
- 실제 DB의 테이블과 매칭될 클래스임을 명시한다.
- 즉, 테이블과 링크될 클래스임을 나타냅니다.
- Entity Class
- 가장 Core한 클래스
- 클래스 이름을 언더스코어 네이밍(_)으로 테이블 이름을 매칭한다.
- Ex) SalesManage스.java -> sales_manager table
- TIP) Controller에서 쓸 DTO 클래스란
- Request와 Response용 DTO는 View를 위한 클래스로, 자주 변경이 필요한 클래스이다.
- Entity 클래스와 DTO 클래스를 분리하는 이유
- View Layer와 DB Layer를 철저하게 역할 분리를 하는게 좋다.
- 테이블과 매핑되는 Entity 클래스가 변경되면 여러 클래스에 영향을 끼치게 되는 반면 View와 통신하는 DTO 클래스(Request/ Response 클래스)는 자주 변경되므로 분리해야 한다.
@Id
- 해당 테이블의 PK 필드를 나타낸다.
@GeneratedValue
- PK의 생성 규칙을 나타낸다.
- TIP) 가능한 Entity의 PK는 Long 타입의 Auto_increment를 추천한다.
- 기본값은 AUTO로, MySQL의 auto_increment와 같이 자동 증가하는 정수형 값이 된다.
- 스프링 부트 2.0에선 옵션을 추가하셔야만 auto_increment가 된다.
@Column
- 테이블의 컬럼을 나타내면, 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 컬럼이 된다.
- @Column을 생략하면 필드명을 사용해서 컬럼명과 매핑하게 된다.
- Ex) @Column(name = "username")
- 이 Annotation을 사용하는 이유는, 기본값 외에 추가로 변경이 필요한 옵션이 있을 경우 사용한다.
- Ex) 문자열의 경우 VARCHAR(255)가 기본값인데, 사이즈를 500으로 늘리고 싶거나(ex: title), 타입을 TEXT로 변경하고 싶거나(ex: content) 등의 경우에 사용된다.
[Json]
@JsonManagedReference
@JsonBackReference
@JsonProperty
@JsonIgnore
[Jackson Property Inclusion Annotation]
@JsonIgnoreProperties
- 무시할 속성이나 속성 목록을 표시할 때 사용한다.
@JsonIgnore
- 필드 레벨에서 무시할 속성을 표시할 때 사용한다.
@JsonIgnoreType
@JsonInclude
- 어노테이션 속성을 제외할 때 사용한다.
- @JsonInclude(JsonInclude.Include.NON_NULL)
- NON_NULL 사용 시 name이 null인 경우에 제외된다.
@JsonAutoDetect
- @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
반응형
'개발 > Spring' 카테고리의 다른 글
[카카오 면접] @SpringBootApplication (0) | 2020.09.19 |
---|---|
[카카오 면접] @WebServelet @Controller (0) | 2020.09.18 |
[카카오 면접] @Service,@Controller,@Component 차이 (0) | 2020.09.08 |
[카카오 면접] Spring Filter, Interceptor, AOP (3) | 2020.09.06 |
[카카오 면접] 서블릿 컨테이너, 스프링부트 동작 과정 (0) | 2020.08.31 |
Comments