[241104 TIL] 

프로젝트 준비 및 설정

기본 설정

  • Language: Java
  • Build system: Gradle - Groovy
  • JDK: 17

Dependencies

  • Lombok
  • Validation
  • Spring Security
  • Spring Web
  • Spring Data JPA
  • MySQL Driver
  • Thymeleaf

build.gradle

  • JWT, json
// JWT
compileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'

// json
implementation 'org.json:json:20230227'

application.properties

  • mysql, jpa , jwt 설정
spring.datasource.url=jdbc:mysql://localhost:3306/shop
spring.datasource.username=root
spring.datasource.password={비밀번호}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true

jwt.secret.key=7Iqk7YyM66W07YOA7L2U65Sp7YG065+9U3ByaW5n6rCV7J2Y7Yqc7YSw7LWc7JuQ67mI7J6F64uI64ukLg==

Database

  • shop
    • user
    • product
    • folder
    • product_folder

Open API

  • NAVER 쇼핑 API

 

요구사항 및 기능 정리

요구사항

  • 상품 검색 ( naver )
    • 탐색하기 - 키워드로 상품 정보 검색
      • 네이버 API 이용 - 상품 이름(title), 링크 URL (link), 이미지 URL (image), 최저가(lprice)
    • 관심 상품
      • 관심 상품 등록
        • DB 에 상품 정보 입력 (insert)
          • 상품 이름(title), 링크 URL (link), 이미지 URL (image), 최저가(lprice)
          • 희망 최저가 (myprice) → 0원 설정
      • 관심 상품의 희망 최저가 설정
        • DB 업데이트 (update)
          • 등록된 관심 상품의 희망 최저가 (myprice) 만 업데이트
      • 모아보기 - 관심 상품 조회
        • DB 조회 (select)
          • 등록된 모든 관심 상품 정보 조회
        • UI 에 최저가 표시 조건 - 희망하는 최저가보다 실제 최저가가 낮은 경우
  • Scheduler
    • 매일 새벽 1시에 관심 상품 목록 제목으로 검색해서, 최저가 정보를 업데이트
  • 회원
    • 회원가입 - username, password, email, role(EunmType)
    • RoleEnum - User, Admin
    • JWT 로그인 인증 처리 (Filter)
    • Spring Security
  • 회원별 상품
    • 상품 : 회원 = N : 1 (단방향 연관관계)
    • Admin - 모든 상품 조회 가능
  • 상품 페이징 및 정렬
    • 페이징
      • page: 조회할 페이지 번호 (1부터 시작)
      • size: 한 페이지에 보여줄 상품 개수 (10개로 고정)
    • 정렬
      • sortBy (정렬항목)
        • id(Product 테이블의 id), title, lprice
      • isAsc (오름차순)
  • 상품 폴더 설계/생성
    • 폴더 설계
      • 폴더 테이블
        • name(폴더명) - 회원이 등록한 폴더 이름을 저장
        • user(회원ID) - 폴더를 등록한 회원의 ID 를 저장(A 가 생성한 폴더는 A 에게만 보여야 함)
      • 상품_폴더 테이블
      • 연관관계
        • 폴더 : 회원 = N : 1 (단방향 연관관계)
        • 폴더 : 상품 = N : M (다대다 관계)
        • 폴더 : 상품_폴더(관계 x) = 1 : N = 상품 : 상품_폴더(양방향 연관관계)
    • 폴더 생성
      • 회원별 폴더를 추가할 수 있음
      • 폴더를 추가할 때 1 ~ N 개를 한번에 추가할 수 있음
  • 관심 상품에 폴더 추가
    • 관심 상품에 폴더는 N개 설정 가능
    • 관심 상품은 생성한 폴더를 선택하여 추가 가능
  • 폴더 별 관심 상품 조회
    • 회원은 폴더 별로 관심 상품 조회 가능
      • '전체' 클릭 - 폴더와 상관없이 저장한 모든 관심 상품 조회
      • '폴더명' 클릭 - 폴더 별 저장된 관심 상품 조회
  • 카카오 로그인
  • Spring AOP
  • 테스트
  • API 예외 처리
  • AWS 적용

 

API

기능 Method URL (API) 함수명 Request Response 설명
키워드로 상품검색 GET /api/search?query=검색어 searchItems @RequestParam String qeury List<ItemDto>  
관심 상품 등록 POST /api/products createProduct @RequestBody ProductRequestDto requestDto ProductResponseDto  
관심 상품 희망 최저가 업데이트 PUT     @PathVariablLong id
@RequestBody ProductRequestDto requestDto
ProductResponseDto  
관심 상품 조회 GET /api/products getProducts   List<ProductResponseDto>  
로그인 페이지 GET /api/user/login-page loginPage   String 로그인 페이지 호출(View ) - templates>login.html
회원가입 페이지 GET /api/user/signup signupPage   String 회원가입 페이지 호출(View) - templates>signup.html
회원가입 POST /api/user/signup signup @Valid SignupRequestDto requestDto,BindingResult bindingResult String 회원가입
회원 정보 요청 GET /api/user-info getUserInfo @AuthenticationPrincipal UserDetailsImpl userDetails UserInfoDto 회원 관련 정보 받기
로그인   /api/user/login        
Admin 조회   /api/admin/products getAllProducts   List<ProductResponseDto>  
회원의 폴더생성 POST /api/folders addFolders      
회원의 폴더조회 GET /api/user-folder        
폴더 전체 조회 GET /api/folders        
폴더 추가 POST /api/products/{productId}/folder        
폴더  상품조회 GET /api/folders/{folderId}/products        

 

 

Entity

  • Product
컬럼명 컬럼타입 중복허용 설명
id Long X 테이블 ID (PK)
title String   상품명
link String   상품 URL
image String   이미지 URL
lprice int   최저가
myprice int   희망 최저가
  • User
컬럼명 컬럼타입 중복허용 설명
id Long X user 테이블 ID (PK)
username String X 유저명
password String O 비밀번호
email String X 이메일
role String O 권한

+ Recent posts