[241105 TIL] 

My Select Shop 프로젝트

  • 구현 기능 점검
  • 카카오 로그인 구현
  • Spring AOP, Timer 적용
  • 예외처리

구현 기능 점검

⚠️ 트러블슈팅 ⚠️

 

1. 문제 정의

  • 관심 상품 폴더 기능 점검중, 폴더 추가가 제대로 이뤄지지 않는 문제 발견
    • 관심 상품에서 폴더 추가 버튼을 누르면 작동하지 않음
    • 폴더 추가를 하면 중복하지 않는 폴더명임에도 중복된 폴더라는 알림이 뜨지만, 폴더 추가는 됨

 

2. 원인 추론

 

ERROR

org.thymeleaf.exceptions.TemplateInputException: Error resolving template [api/folders], template might not exist or might not be accessible by any of the configured Template Resolvers

 

 

 

1. thymeleaf exception 이 발생했기에 front 문제인가?

  • console 오류를 확인해보니 basic.js 파일의 folders.map 이 제대로 동작하지 않음을 확인
  • front 의 문제는 아니고, folder 를 제대로 넘겨받지 못하는 문제인듯함

 

2. FolderController 에 API 를 잘못 작성했나?

  • 구글링해보니 API 주소를 잘못 적은 경우가 다반사이길래 확인해보니, 모두 정확하게 적혀있음

 

3. FolderService 에 폴더 추가 함수 자체가 잘못 작성됐나?

  • 조회 함수에서 print를 찍어보니 folderList 가 제대로 생성되지 않음을 확인

  • 추가 함수에서 print를 찍어보니 print 안됨 -> addFolders 함수 안으로 들어가지 못함

 

➡️  folder 가 제대로 넘어오지 못함

 

 

4. FolderController 에서는 folder 가 제대로 생성되는지?

  • PostMapping 에서 print를 찍어보니 print 안됨

 

➡️ @RequestBody 가 제대로 동작하지 않음

 

 

5. @RequestBody 사용을 위한 애노테이션이 제대로 작성되어 있는지?

  • @Controller 만 작성되어 있음을 확인!!

 

3. 해결 방안 및 결과 

  • @Controller -> @RestController
    • @RequestBody 를 사용하려면 @RestController 혹은 @Controller + @ResponseBody 가 명시되어야 함!!
  • @RestController 변경 후 폴더 추가가 제대로 동작됨을 확인

 


카카오 로그인 구현

⚠️ 트러블슈팅 ⚠️

 

1. 문제 정의

  • 카카오 로그인 앱 관리자 설정 오류

 

2. 원인 추론

 

1. Redirect URI 가 잘못 작성되었나?

  • 카카오에 등록한 Redirect URI : http://localhost:8080/api/user/kakao/callback
  • KakaoService 에 작성한 Redirect URI : http://localhost:8080/api/user/login-page/api/user/kakao/callback

 

3. 해결 방안 및 결과

  • redirect_uri 수정
    • http://localhost:8080/api/user/login-page/api/user/kakao/callback
      -> http://localhost:8080/api/user/kakao/callback
  • 수정 후 카카오 로그인 성공!

 

[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