3.1 API 설계 (1)
특정 회사의 배당금 조회
- GET
- 배당금 조회는 배당금 프로젝트에서 핵심이자 기본적인 서비스
- 모바일 앱에 저장이되어 있는 게 아니라 사용자가 해당 데이터에 접근할 때, 배당금이 조회되도록 한다.
- 응답은 Json 형태로 줄 예정 - 회사명, 배당금(날짜, 금액)
배당금 검색 - 자동 완성 기능
- GET
- 키워드 기준으로 회사 이름을 조회하는 기능
3.2 API 설계 (2)
관리자 API
- 배당금 저장
- POST
/company
{ ticker: “GOOD” }
- POST
- 배당금 삭제
- DELETE
/company?ticker=GOOD - DELETE를 request body가 아닌 request parameter로 넘겨주는 이유는?
- body에 넘겨줄 수도 있기는 한다.
- POST에는 request body의 역할이 정의되어 있는 반면에 DELETE는 명시적인 약속이 없다.
- GET 할 때 회사 ticker명을 request body가 아닌 request parameter로 넘긴 것도 같은 이유이다.
- 서버에서는 DELETE 요청을 보내면 body를 무시할 수도 있다. 따라서, 더 명확한 방법을 선택한다.
- DELETE
cf) GET/ POST/ DELETE 기본적인 메서드에 대한 정보 파악하기
- 공식 문서 url - https://www.rfc-editor.org/rfc/rfc9110.html
- GET / POST의 차이는? (면접 빈출 질문)
- GET: 클라이언트에서 서버에 어떤 리소스로부터 정보를 요청하기 위해 사용하는 메서드이다.
- GET을 통한 요청은 url에 param 로 포함되어 전송된다.
- 따라서, 길이 제한이 있고 중요한 정보를 다루면 안된다. - 보안 이슈
- POST: 클라이언트가 서버로 리소스를 생성하거나 업데이트하기 위해 데이터를 보낼 때 사용하는 메서드
- HTML form을 통해 서버로 데이터가 전송된다.
- body 안에 submit 할 정보가 포함되어 있어서 url에 드러나지 않는다.
- POST 요청을 캐시되지 않으며 브라우저 히스토리에 남지 않는다.
- 길이에 제한이 없다.
- GET POST 차이점
- 사용 목적: GET(서버에 데이터 요청) / POST(서버에 데이터를 새로 생성 또는 업데이트)
- 요청에 body 유무: GET은 HTTP 메시지에 body가 없고 POST는 HTTP 메시지에 body에 데이터를 담아보내기 때문에 당연히 body가 있다.
- 멱등성(idempotent): 연산을 여러 번 적용했을 때, 결과가 달라지지 않는 성질을 말한다.
- GET은 여러 번 조회해도 결과가 같지만 POST는 새로 생성하거나 업데이트할 때 사용된다.
- 따라서 GET는 명등 / POST는 멱등이 아니다.
- GET: 클라이언트에서 서버에 어떤 리소스로부터 정보를 요청하기 위해 사용하는 메서드이다.
회원 API
- 회원 가입
- 로그인
- 로그아웃
@PathVariable과 @RequestParam 의 차이는?
- 공통점: 둘다 데이터를 받아오는데 사용한다.
- @PathVariable: 데이터를 하나만 받아올 수 있다.
- name: uri에서 바인딩할 파라미터의 이름
- value: uri에서 바인딩하여 별칭으로 정할 값
- requied: 필수적으로 값이 전달되어야할 파라미터이다. 없으면 에러 발생
- @RequestParam: 여러 개의 데이터를 받아온다.
- @RequestParam = @PathVariable + defaultValue()
- defaultValue: 값이 없을 때 기본적으로 전달할 값
3.3 API 구현
Ex) 각 클래스의 역할 구분
- CompanyController
- @PathVariable: 데이터를 하나만 받아올 수 있다.
- @RequestParam: 데이터를 여러 개 받아올 수 있다.
- ResponseEntity<?>: HttpEntity<T>를 상속한다.
- HttpEntity: HTTP 요청이나 응답에 해당하는 HttpHeader와 HttpBody 를 포함하는 클래스이다.
- ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이다.
- 따라서, HttpHeader, HttpBody, HttpStatus를 포함한다.
- 경로에서 공통으로 들어가는 부분은 @RequestMapping()으로 빼준다.
<hide/>
package com.dayone.web;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/company")
public class CompanyController {
@GetMapping("/autocomplete")
public ResponseEntity<?> autocomplete(@RequestParam String keyword){
return null;
}
@GetMapping
public ResponseEntity<?> searchCompany(){
return null;
}
// 저장
@PostMapping
public ResponseEntity<?> addCompany(){
return null;
}
// 회사 삭제
@DeleteMapping
public ResponseEntity<?> deleteCompany(){
return null;
}
}
- FinanceController
<hide/>
package com.dayone.web;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/finance")
public class FinanceController {
@GetMapping("/dividend/{companyName}")
public ResponseEntity<?> searchFinance(@PathVariable String companyName){
return null;
}
}
3.4 DB 설계
분산 데이터베이스
- 서버도 이와 같이 분산된 환경으로 운영하는 경우가 많다.
- "분산 처리 시스템"
- A, C 데이터베이스의 Key를 auto_increment로 설정하면 같은 데이터에 대한 pk값이 달라진다.
- 이를 어떻게 매칭할 수 있을까?
@GeneratedValue(strategy= GenerationType. ? )
- @Id와 @GeneratedValue를 함께 생성하면 Id가 자동 생성되도록 설정 가능하다. (@Id만 설정하면 Id를 직접 할당한다.)
- IDENTITY: 기본키 생성을 DB에 위임, 특정 벤더에 의존적 (MySQL는 auto_increment)
- ex) MySQL
- SEQUENCE: DB의 sequence 객체를 이용해서 유일한 값을 순서대로 이용한다. 특정 벤더에 의존적이다.
- ex) sequence를 사용하는 Oracle, H2M, DB2 등에서 사용한다.
- TABLE: 시퀀스 테이블을 만들어서 데이터베이스 시퀀스를 흉내낼 Id를 할당한다. 특정 벤더에 의존적이지 않다.
- AUTO: DB벤더에 따라 자동으로 세 가지 전략 중 하나를 선택한다.
3.5 엔티티 구현
Ex) Entity 구현
- yml 파일
- ddl-auto 기능은 애플리케이션을 실행할 때마다 테이블을 만드는 기능이므로 개발 초기 단계에서만 사용한다.
- use-new-id-generator-mappings : auto_increment와 관련
- spring.jpa.show-sql: 개발 단계에서 true 설정
- spring.jpa.defer-datasource-initialization: 데이터 초기화할 때 사용하는 옵션
- entity
- 자동 증가로 설정하기 위해 생성 타입을 IDENTITY로 설정한다.
<hide/>
package com.dayone.persist.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity(name = "COMPANY")
@Data
@NoArgsConstructor
public class CompanyEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private String ticker;
private String name;
}
- 배당금 entity
<hide/>
package com.dayone.persist.entity;
import java.time.LocalDateTime;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity(name = "DIVIDEND")
@Data
@NoArgsConstructor
public class DividendEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long companyId;
private LocalDateTime dateTime;
private String dividend; // 금액?을 왜 string으로?
}
- JpaRepository<"엔티티명", "엔티티 안에서의 pk 타입">
- 회사 repo, 배당금 repo 둘다 만든다.
'Spring Projcect > 배당금 프로젝트' 카테고리의 다른 글
Chapter 06. 완성도 높이기 (0) | 2022.09.20 |
---|---|
Chapter 05. 회원 관리 (0) | 2022.09.19 |
Chapter 04. 서비스 구현 (0) | 2022.09.14 |
Chapter 02. 스크래핑(Scraping) (0) | 2022.09.12 |
Chapter 01. 프로젝트 환경 설정 (0) | 2022.09.12 |