본문 바로가기
OpenSource/Spring Boot

7) ENS Project - DB로 전환02

by 태하팍 2024. 10. 11.
반응형

저번시간에는 DB설계와 MySQL 셋팅을 해보았습니다.

오늘은 JPA연동 작업 입니다.

제일 먼저 Dependency를 걸어줍니다.
JPA 관련, MySQL 관련, h2는 테스트 코드에서 MySQL이 아닌 h2를 바라봐야해서 필요 합니다

    // jpa setting
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    // MySQL - https://mvnrepository.com/artifact/mysql/mysql-connector-java
    runtimeOnly 'mysql:mysql-connector-java:8.0.33'
    // h2 for in-Memory test
    testRuntimeOnly 'com.h2database:h2'

그리고 property yml을 작성해야하는데 아래와 같이 application.yml과 application-dev.yml 2개로 분리 합니다.
지금은 한곳에 해도 되지만 보통 나눠서 작업하기 때문에 나눴습니다ㅋㅋ

또한 h2와 MySQL은 아래와 같이 test resources쪽에 h2 설정을 하고
MySQL설정은 실제로 동작하는 resources에 생성합니다.
즉, 2phase commit 아니라는 말입니다. (데이터소스가 2개 아님 주의!)

h2 yml

logging:
  level:
    root: info
spring:
  output:
    ansi:
      enabled: always
  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect # h2 dialect
        format_sql: true
  datasource:
    url: jdbc:h2:mem:test
    driverClassName: org.h2.Driver
    username: sa
    password:
  h2:
    console:
      enabled: true

MySQL yml

logging:
  level:
    root: info
spring:
  output:
    ansi:
      enabled: always
  jpa:
    database-platform: org.hibernate.dialect.MySQLDialect
    hibernate:
      ddl-auto: create
    show-sql: true
    properties:
      hibernate:
        format_sql: true
  datasource:
    url: jdbc:mysql://localhost:3306/ens?useSSL=false
    username: root
    password: 패스워드
    driver-class-name: com.mysql.cj.jdbc.Driver

디폴트 yml은 아래와 같이 서버포트나 open ai 관련 내용을 넣습니다. 말그대로 공통적으로 사용되는 내용 입니다.

spring:
  application:
    name: EasyNaverStore
  ai:
    openai:
      api-key: sk-스크 말고 두산!
      chat:
        options:
          model: gpt-4o
server:
  port: 8080

오류가 없는지 우선 동작 시켜 봅니다.
동작은 profile에 dev를 넣어야 합니다.

동작 확인 완료!

이제는 JPA 소스를 작성 합니다.

1. Entity 작성
DB 설계에 맞게 필요한 Entity를 만들어줍니다.
domain 디렉토리 아래 송장과 발주 2개의 디렉토리를 만들어줍니다.
발주 관련이니 Entity는 발주(order request) domain에 작성하겠습니다.

아래처럼 Entity를 작성!
참고 : 2024.09.10 - [OpenSource/JPA] - JPA 연동 가이드 - 개발편

확인은 인텔리J에서 제공하는 DB툴을 사용!

위에서 지정한 JPA ddl-auto가 create이기 때문에 스프링부트를 구동을하면
아래와 같이 테이블 생성을 확인할 수 있습니다. 

이제 우선적으로 작업을 해야할 것은?
전 포스팅에서 머릿속에서 그림을 그려보았던 부분을 참고하면 
이름과 이메일을 company 테이블에 없으면 insert 있으면 select 해오는 부분이 있다.

그리고 clientId와 clientSecret정보는 어플리케이션이라는것을 만든 후에 나오는 값들이라..
값을 구한 뒤에 update하는 기능이 필요하다.

마지막으로 clientId와 clientSecret 정보를 조회하여 값을 가지고 토큰을 만들어서 Json을 만든 뒤
products table에 insert 시키는것이 필요하다.
이렇게 머릿속에 그려지면 게임은 끝이다ㅋㅋ 


이제 로그인은 없지만 로그인을 한다는 가정하에 로그인 컨트롤러부터 만들어보자!

insert 부분

DB 결과

날짜가 안들어가있다면! 아래 어노테이션을 추가했는지 체크하자! 

@EnableJpaAuditing

update 부분

DB 결과

업체 컨트롤러 소스

    // 업체 하나 삽입
    @PostMapping("/v1/save/company")
    public Long createCompany(@RequestBody CompanyRequestDto companyRequestDto) {
        return companyService.createCompany(companyRequestDto);
    }

    // 업체 하나 수정
    @PutMapping("/v1/company/{email}")
    public String update(@RequestBody CompanyRequestDto requestDto){
        return companyService.update(requestDto);
    }

    // 모든 업체 조회
    @GetMapping("/v1/companies")
    public List<CompanyListResponseDto> findAllCompanies() {
        return companyService.findAllCompanies();
    }

    // 업체 하나 조회
    @GetMapping("/v1/company/{email}")
    public CompanyResponseDto findByEmail(@PathVariable String email){
        return companyService.findByEmail(email);
    }

    // 업체 하나 삭제 
    @DeleteMapping("/v1/company/{email}")
    public String delete(@PathVariable String email) {
        companyService.deleteCompany(email);
        return email;
    }

repository 소스

@Repository
public interface CompanyRepository extends JpaRepository<Company, Long> {
    @Query("SELECT g FROM Company g ORDER BY g.id DESC")
    List<Company> findAllCompanies();
    Optional<Company> findByEmail(String email);
}

소스는 여기까쥐하고 결론적으로 JPA를 가지고 CRUD를 만들었다.
Swagger로 보면 아래와 같다.

이제 Product로 넘어가면 된다! ㅎㅎ

이 포스팅에서는 업체와 상품정보 이 2개의 백엔드 api를 제공하는 것이다.

이제 로그인 후에 정보를 가지고 company table 체크 후 insert or select 
company의 정보와 productName을 가지고 product table에서 가장 최근 갱신 된 날짜를 가지고
LLM을 탈지 말지 하는 것을 구현해야한다.

음..이제 어마무시한 프론트엔드를 학습할 시간이다!!!!!!!

풀스택 가즈아~~~

반응형