[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