✔️ Framework란?
- 프로그램을 개발할 때 필요한 코드, 알고리즘, 암호화, DB 연동 등의 구조를 재사용이 가능하도록 협업화된 형태로 제공하는 소프트웨어 환경.
- 개발에 필요한 구조를 이미 코드로 만들어 놓은 형태.
✔️ Spring Framework란?
- 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크.
✔️ Annotation이란?
- 어떤 용도로 사용할지, 클래스에 어떤 역할을 줄지에 대한 내용을 담은 것.
- 클래스 파일에 내장되어 컴파일러에 의해 생성된 후, JVM에 포함되어 작동하는 원리.
- 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터 일종.
- 메타데이터 : 어떤 목적을 가지고 만들어진 데이터.
✔️ Annotation 모음
- @Autowired : 의존 관계를 자동으로 설정할 때 사용. 생성자, 필드, 메서드의 3곳에 적용 가능.
- @Component : 특정 패키지 안의 클래스들 스캔. bean 인스턴스를 생성.
- @Controller, @Service, @Repository : @Component —구체화—> @Controller, @Service, @Repository. bean으로 등록.
- @Controller : API와 view를 동시에 사용하는 경우에 사용. 대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체 반환. view(화면) return이 주목적.
- @RestController : view가 필요없는 API만 지원하는 서비스에서 사용 (Spring 4.0.1부터 제공). @RequestMapping 메서드가 기본적으로 @ResponseBody라는 의미. @ResponseBody를 모든 메소드에서 적용(메소드의 반환 결과(문자열)를 JSON 형태로 반환). data(json, xml 등) return이 주목적.
- @RequestMapping : 요청경로 지정. ()안의 경로(path)와 컨트롤러를 이어줌(=매핑).
- @RequestParam : HTTP GET 요청에 대해 매칭되는 request parameter 값이 자동으로 들어감. url 뒤에 붙는 parameter 값을 가져올 때 사용. 반드시 해당 파라미터가 전송되어야 함 (required=true). 해당 파라미터 미전송 시, 400 Error 발생. required=false로 명시해줘야 필수 전송이 아니게 됨.
- @RequestBody : 반드시 HTTP POST 요청에 대해서만 처리. HTTP POST 요청에 대해 request body에 있는 request message에서 값을 얻어와 매칭. 클라이언트가 전송하는 HTTP 요청의 Body 내용을 Java Object로 변환. RequestData를 바로 Model이나 클래스로 매핑, 즉 JSON 이나 XML같은 데이터를 적절한 messageConverter로 읽을 때 사용하거나 POJO 형태의 데이터 전체로 받는 경우에 사용.
- @ModelAttribute : @RequestParam과 비슷. JSP에서 Form 태그를 통해 전달받은 파라미터들을 객체로 바인딩시키는 경우에 사용. 특정 파라미터만 받을 수 있음. 클라이언트가 전송하는 여러 파라미터들을 1:1로 객체에 바인딩하여 View로 넘겨서 출력하기 위해 사용되는 객체. @RequestBody는 Json/XML을 MessageConverter를 사용하여 변환시키지만, @ModelAttribute는 여러 개의 파라미터를 바로 자바빈 객체로 매핑.
- @PathVariable : HTTP 요청에 대해 매칭되는 request parameter 값이 자동으로 들어감. uri에서 각 구분자에 들어오는 값을 처리해야 할 때 사용. REST API에서 값을 호출할 때 주로 사용. URL의 {템플릿변수}와 동일한 이름을 갖는 파라미터를 추가하여 해당 템플릿변수의 값을 받음. null이나 공백값이 들어가면 안됨. @PathVariable의 템플릿변수 값에 .이 포함되어 있으면 그 뒤가 잘려서 들어옴.
- @Required : setter method에 사용. 영향을 받는 bean property 구성 시 XML 설정 파일에 반드시 property를 채워야 함(엄격한 체크). 그렇지 않으면 BeanInitializationException 예외 발생.
- @Qualifier : 같은 타입의 빈이 두 개 이상이 존재하는 경우에 스프링이 어떤 빈을 주입해야 할지 알 수 없어서 스프링 컨테이너를 초기화하는 과정에서 예외 발생. 이 경우 @Qualifier을 @Autowired와 함께 사용하여 정확히 어떤 bean을 사용할지 지정하여 특정 의존 객체를 주입할 수 있도록 함.
- @Resource : Annotation 사용으로 인해 특정 Framework에 종속적인 어플리케이션을 구성하지 않기 위해서 사용.
- @Vaild
- @Configuration
- @EnableWebSecurity
- @SpringBootApplication
- @EnableWebMvc
- @RestControllerAdvice
- @ExceptionHandler
- @ResponseStatus
- @EnableJpaAuditing : JPA Auditing을 활성화.
- @MappedSuperclass : JPA Entity 클래스들이 BaseTimeEntity을 상속할 경우 필드들(createdDate, modifiedDate)도 컬럼으로 인식하게 함.
- @EntityListeners(AuditingEntityListener.class) : BaseTimeEntity 클래스에 Auditing 기능을 포함.
- @CreatedDate : Entity가 생성되어 저장될 때 시간을 자동 저장.
- @LastModifiedDate : 조회한 Entity의 값을 변경할 때 시간을 자동 저장.
- @Transactional : 메소드 내에서 Exception이 발생하면 해당 메소드에서 이루어진 모든 DB 작업을 초기화. 즉, save 메소드를 통해서 10개를 등록해야 하는데 5번째에서 Exception이 발생하면 앞에 저장된 4개 까지 모두 롤백. (이미 넣은걸 롤백시키는건 아니며, 모든 처리가 정상적으로 됐을때만 DB에 커밋. 그렇지 않은 경우엔 커밋하지 않음.) 비지니스 로직과 트랜잭션은 모두 Service에서 관리. 따라서 일반적으로 DB 데이터를 등록/수정/삭제 하는 Service 메소드는 @Transactional를 필수적으로 가짐.
- @Table : 엔티티 클래스에 매핑할 테이블 정보를 알려줌.
Ex) @Table(name = "USER")
이 어노테이션을 생략하면 클래스 이름을 테이블 이름 정보로 매핑함.
- @Entity : 실제 DB의 테이블과 매칭될 클래스임을 명시. 즉, 테이블과 링크될 클래스임을 나타냄. Entity Class는 가장 Core한 클래스. 클래스 이름을 언더스코어 네이밍(_)으로 테이블 이름을 매칭함.
Ex) SalesManage.java -> sales_manager table
- @Id : 해당 테이블의 PK 필드.
- @GeneratedValue : PK의 생성 규칙.
- @Column : 테이블의 컬럼을 나타내면, 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 컬럼이 됨. @Column을 생략하면 필드명을 사용해서 컬럼명과 매핑하게 됨. 기본값 외에 추가로 변경이 필요한 옵션이 있을 경우 사용.
- @NoArgsConstructor : 기본생성자를 자동으로 추가. Entity 클래스를 프로젝트 코드상에서 기본생성자로 생성하는 것은 막되, JPA에서 Entity 클래스를 생성하는것은 허용하기 위함.
- @AllArgsConstructor : 모든 필드 값을 파라미터로 받는 생성자를 추가.
- @RequiredArgsConstructor : final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 추가. final 값이 할당되면 더 이상 변경할 수 없음.
- @Getter : 클래스 내 모든 필드의 Getter 메소드를 자동으로 생성.
- @Setter : Controller에서 @RequestBody로 외부에서 데이터를 받는 경우엔 기본생성자 + set메소드를 통해서만 값이 할당됨. 이때만 setter를 허용함.
- @ToString : 특정 필드를 toString() 결과에서 제외. 클래스명(필드1명=필드1값, 필드2명=필드2값, …) 식으로 출력됨.
- @EqualsAndHashCode : equals와 hashCode 메소드 오버라이딩.
- @Builder : 어느 필드에 어떤 값을 채워야 할지 명확하게 정하여 생성 시점에 값을 채워줌. 생성자와 빌더는 생성 시점에 값을 채워준다는 공통점. 하지만 빌더를 사용하면 어느 필드에 어떤 값을 채워야 할지 명확하게 인지할 수 있음. 해당 클래스의 빌더 패턴 클래스를 생성. 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함됨.
- @Data : @Getter @Setter @EqualsAndHashCode @AllArgsConstructor 을 포함한 Lombok에서 제공하는 필드와 관련된 모든 코드를 생성.
- @JsonManagedReference
- @JsonBackReference
- @JsonProperty
- @JsonIgnore
- @Configuration
- @EnableTransactionManagement
- @PropertySource(“classpath:application-properties.xml”)
- @JsonIgnoreProperties : 무시할 속성이나 속성 목록을 표시할 때 사용.
- @JsonIgnore : 필드 레벨에서 무시할 속성을 표시할 때 사용.
- @JsonIgnoreType
- @JsonInclude : 어노테이션 속성을 제외할 때 사용.
- @JsonAutoDetect
- @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
- @EnableAspectJAutoProxy
- @Aspect
- @PointCut
- @Before (이전) : 어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능을 수행.
- @After (이후) : 타겟 메소드의 결과에 관계없이(즉 성공, 예외 관계없이) 타겟 메소드가 완료 되면 어드바이스 기능을 수행.
- @Around (메소드 실행 전후) : 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후에 어드바이스 기능을 수행.
- @AfterReturning (정상적 반환 이후) : 타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행.
- @AfterThrowing (예외 발생 이후) : 타겟 메소드가 수행 중 예외를 던지게 되면 어드바이스 기능을 수행.
✔️ Spring Framework의 Migration Tools
flyway
- Data Migration : 데이터를 한 위치/형식/애플리케이션에서 다른 위치/형식/애플리케이션으로 이동하는 프로세스.
DB는 생성하고 나서 가급적 건들지 않는 게 좋으나 가끔 새로운 data를 db table에 추가하거나 할 때 이용하면 편리함. - 데이터 마이그레이션 방법 :
- 몇몇 DB는 원격지에서의 Import·Export를 지원
- 대부분은 기존 DB에서 Export를 수행한 후 생성된 파일을 신규 DB 서버로 복사하고 Import를 수행하는 방식. 네트워크 지연을 최소화하기 위함.
✔️ RestTemplate 이용해서 API 생성
RestTemplate restTemplate = new RestTemplate()
특징
- Spring에서 REST API 호출을 위한 함수를 제공하는 HTTP클라이언트
- Spring Framework 5부터 사용 되지 않음. Spring이 WebFlux 스택과 함께 WebClient라는 새로운 HTTP 클라이언트를 도입했기 때문. WebClient는 RestTemplate에 대한 최신 대체 HTTP 클라이언트. 기존의 동기식 API를 제공 할뿐만 아니라 효율적인 비 차단 및 비동기 접근 방식도 지원함.
- 자동으로 빈 등록되지 않기 때문에 직접 등록해줘야 함.
메서드 종류
exchange(..) | any | 지정된 HTTP 메서드를 URL에 대해 실행하며, Response body와 연결되는 객체를 포함하는 responseEntity를 반환한다. |
execute(..) | any | 지정된 HTTP 메서드를 URL에 대해 실행하며, Response body와 연결되는 객체를 반환한다. |
getForEntity(..) | GET | HTTP GET 요청을 전송하며, Response body와 연결되는 객체를 포함하는 ResponseEntity를 반환한다. |
getForObject(..) | GET | HTTP GET 요청을 전송하며, Response body와 연결되는 객체를 반환한다. |
headForHeaders(..) | HEAD | HTTP HEAD 요청을 전송하며, 지정된 리소스 URL의 HTTP 헤더를 반환한다. |
optionsForAllow(..) | OPTIONS | HTTP OPTIONS 요청을 전송하며, 지정된 URL의 Allow 헤더를 반환한다. |
patchForObject(..) | PATCH | HTTP PATCH 요청을 전송하며, Response body와 연결되는 결과 객체를 반환한다. |
postForEntity(..) | POST | URL에 데이터를 POST하며, Response body와 연결되는 객체를 포함하는 ResponseEntity를 반환한다. |
postForLocation(..) | POST | URL에 데이터를 POST하며, 새로 생성된 리소스의 URL를 반환한다. |
postForObject(..) | POST | URL에 데이터를 POST하며, Response body와 연결되는 객체를 반환한다. |
put(..) | PUT | 리소스 데이터를 지정된 URL에 PUT한다. |
delete(..) | HTTP | 지정된 URL의 리소스에 HTTP DELETE 요청을 수행한다. |
'Today I Learned' 카테고리의 다른 글
[D3] 이클립스 오류 해결 방법, 참고 사이트 모음 / 학습 노트 (0) | 2021.08.18 |
---|---|
[DB] Oracle 관리자모드 접속 방법, SQL Developer 연결 오류 / 학습 노트 (0) | 2021.06.02 |
[Java] 이클립스(Eclipse) 단축키, 자바 버전 변경, 각종 에러 해결 / 학습 노트 (0) | 2021.03.09 |
[CS] 상태코드 모음 (HTTP status code) / 학습 노트 (0) | 2021.03.05 |
[Git] Subversion(SVN)과의 비교, Revert commit 해결법 / 학습 노트 (0) | 2021.03.04 |