Spring Projcect/배당금 프로젝트

Chapter 03. 서비스 설계

계란💕 2022. 9. 13. 13:19

3.1 API 설계 (1)

 

클라이언트와 서버

 

특정 회사의 배당금 조회

  • GET
  • 배당금 조회는 배당금 프로젝트에서 핵심이자 기본적인 서비스
  • 모바일 앱에 저장이되어 있는 게 아니라 사용자가 해당 데이터에 접근할 때, 배당금이 조회되도록 한다. 
  • 응답은 Json 형태로 줄 예정 - 회사명, 배당금(날짜, 금액)

 

배당금 검색 - 자동 완성 기능

  • GET
  • 키워드 기준으로 회사 이름을 조회하는 기능

 

 

 

3.2 API 설계 (2)

관리자  API

  • 배당금 저장
    • POST
      /company
      { ticker: “GOOD” }
  • 배당금 삭제 
    • DELETE
      /company?ticker=GOOD
    • DELETE를 request body가 아닌 request parameter로 넘겨주는 이유는?
      • body에 넘겨줄 수도 있기는 한다.
      • POST에는  request body의 역할이 정의되어 있는 반면에 DELETE는 명시적인 약속이 없다.
      • GET 할 때 회사 ticker명을 request body가 아닌 request parameter로 넘긴 것도 같은 이유이다.
      • 서버에서는 DELETE 요청을 보내면 body를 무시할 수도 있다. 따라서, 더 명확한 방법을 선택한다.

 

 

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는 멱등이 아니다.

 

 

회원 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 둘다 만든다.

 

출처 - https://zero-base.co.kr/

 

제로베이스 - 누구나 취업하는 가장 합리적인 취업 스쿨

코딩 부트 캠프 개발자, 데이터 사이언티스트, 마케터, PM, 디자이너 등 제대로 공부하고 확실하게 취업하세요. 당신의 삶의 전환점이 될 제로베이스 스쿨입니다.

zero-base.co.kr

'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