From 3afef6371683dea8c010c015523de7f61d65c6bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=ED=83=9C=EC=9C=A4?= <77539625+pykido@users.noreply.github.com> Date: Mon, 5 Aug 2024 15:21:57 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B6=80=EC=82=B0=EB=8C=80=5F=20BE=5F=20?= =?UTF-8?q?=EA=B9=80=ED=83=9C=EC=9C=A4=206=EC=A3=BC=EC=B0=A8=20(3=EB=8B=A8?= =?UTF-8?q?=EA=B3=84)=20(#355)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial commit * feat: set up the project * 부산대 BE_김태윤 5주차 과제 (0단계) (#58) * Initial commit * feat: set up the project * 부산대 BE_김태윤 4주차 과제 (0단계) (#51) * Initial commit * Initial commit * feat: set up the project * 부산대 BE_김태윤_2주차 과제 (0단계 구현) (#86) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(3단계) (#414) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 * docs(README.md) : 3단계 - 위시 리스트 구현할 기능 목록들 정리 * feat : HandlerMethodArgumentResolver 구현 * feat : 위시 리스트 CRUD 기능 구현 --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(1,2단계) (#369) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 --------- Co-authored-by: 박재성(Jason) * refactor : globalhandler는 하나여야 한다. * feat: set up the project * feat : 3주차 - step0 구현 * docs(README.md) : 3주차 1단계 구현할 기능 목록 정리 * feat : spring data jpa 의존성 추가 * feat : 지금까지 작성한 JdbcTemplate 기반 코드를 JPA 기반 코드로 리팩토링 * 부산대 BE_김태윤 3주차 과제 (0단계) (#36) * Initial commit * feat: set up the project * 부산대 BE_김태윤_2주차 과제 (0단계 구현) (#86) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(3단계) (#414) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 * docs(README.md) : 3단계 - 위시 리스트 구현할 기능 목록들 정리 * feat : HandlerMethodArgumentResolver 구현 * feat : 위시 리스트 CRUD 기능 구현 --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(1,2단계) (#369) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 --------- Co-authored-by: 박재성(Jason) * refactor : globalhandler는 하나여야 한다. * feat : 3주차 - step0 구현 --------- Co-authored-by: 박재성(Jason) * feat : 회원가입 및 로그인 E2E test 구현 * refactor : JPA 리팩토링 에러 해결 * feat : @DataJpaTest 활용하여 wishlist CRUD 테스트 * refactor : service interface 생성 및 불필요한 파일들 삭제 * refactor : 전체적인 리팩토링 완료 * refactor : reformat code 적용 * docs(REAME.md) : 3주차 - 2단계 구현할 기능 목록 정리 * feat : 테이블 고려하여 엔티티 설계 * refactor : 회원가입/로그인 로직 리팩토링 * refactor : 디렉토리 구조 변경 * refactor : 사용자의 위시리스트 추가, 삭제, 조회하는 로직 리팩토링 * test : 상품 CRUD 테스트 통과 * test : 사용자의 위시리스트 추가, 삭제, 조회 로직 테스트 통과 * feat : 양방향 연관관계 적극 활용하기 * 부산대 BE_김태윤 3주차 과제 (1단계) (#220) * Initial commit * feat: set up the project * 부산대 BE_김태윤_2주차 과제 (0단계 구현) (#86) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(3단계) (#414) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 * docs(README.md) : 3단계 - 위시 리스트 구현할 기능 목록들 정리 * feat : HandlerMethodArgumentResolver 구현 * feat : 위시 리스트 CRUD 기능 구현 --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(1,2단계) (#369) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 --------- Co-authored-by: 박재성(Jason) * refactor : globalhandler는 하나여야 한다. * feat : 3주차 - step0 구현 * docs(README.md) : 3주차 1단계 구현할 기능 목록 정리 * feat : spring data jpa 의존성 추가 * feat : 지금까지 작성한 JdbcTemplate 기반 코드를 JPA 기반 코드로 리팩토링 * feat : 회원가입 및 로그인 E2E test 구현 * refactor : JPA 리팩토링 에러 해결 * feat : @DataJpaTest 활용하여 wishlist CRUD 테스트 * refactor : service interface 생성 및 불필요한 파일들 삭제 * refactor : 전체적인 리팩토링 완료 --------- Co-authored-by: 박재성(Jason) * feat : conflict 해결! * docs(README.md) : 3주차 3단계 - 페이지네이션 구현할 기능 목록 정리 * feat : wish list 페이지네이션 구현 * feat : product list 페이지네이션 구현 * test : 페이지네이션 테스트 구현 * refactor : Getmapping에 대해 동일한 url 매핑이 되어있는 에러 수정 --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 4주차 과제 (1단계) (#171) * docs(README.md) : 4주차 1단계 구현할 기능 목록 정리 * feat : 카테고리 : 상품 양방향 OneToMany 엔티티 설정 * feat : 카테고리 CRUD 구현 * feat : data.sql을 통해 카테고리 미리 설정하기 * feat : 관리자 화면에서 상품을 추가할 때 상품 카테고리 추가 기능 구현 * feat : 관리자 화면에서 상품을 수정할 때 상품 카테고리 수정 기능 구현 * test : 중복 검사 및 CRUD test 완료 * 부산대_BE 김태윤 4주차 과제 (2단계) (#360) * docs(README.md) : 4주차 1단계 구현할 기능 목록 정리 * feat : 카테고리 : 상품 양방향 OneToMany 엔티티 설정 * feat : 카테고리 CRUD 구현 * feat : data.sql을 통해 카테고리 미리 설정하기 * feat : 관리자 화면에서 상품을 추가할 때 상품 카테고리 추가 기능 구현 * feat : 관리자 화면에서 상품을 수정할 때 상품 카테고리 수정 기능 구현 * test : 중복 검사 및 CRUD test 완료 * docs(README.md) : 4주차 2단계 구현할 기능 목록들 추가 --------- Co-authored-by: azjaehyun <60067259+azjaehyun@users.noreply.github.com> * 부산대 BE_김태윤 4주차 과제 (2,3단계) (#391) * docs(README.md) : 4주차 1단계 구현할 기능 목록 정리 * feat : 카테고리 : 상품 양방향 OneToMany 엔티티 설정 * feat : 카테고리 CRUD 구현 * feat : data.sql을 통해 카테고리 미리 설정하기 * feat : 관리자 화면에서 상품을 추가할 때 상품 카테고리 추가 기능 구현 * feat : 관리자 화면에서 상품을 수정할 때 상품 카테고리 수정 기능 구현 * test : 중복 검사 및 CRUD test 완료 * docs(README.md) : 4주차 2단계 구현할 기능 목록들 추가 * feat : Option 엔티티 설계 * feat : 옵션 crud 구현 및 중복성 관리 구현 * feat : 옵션 페이지 구성 완료 * feat : 옵션 추가 페이지 구성 완료 * feat : 관리자 화면에서 옵션 추가/수정/삭제 기능 구현 * feat : subtract 메서드 구현 * test : 테스트 완료 * refactor : 멘토님 리뷰 반영하여 refactor * feat : 5주차 과제 step0 수행 - 2 --------- Co-authored-by: 박재성(Jason) Co-authored-by: azjaehyun <60067259+azjaehyun@users.noreply.github.com> * 부산대 BE_김태윤_5주차 과제(step1) (#89) * Initial commit * feat: set up the project * 부산대 BE_김태윤 4주차 과제 (0단계) (#51) * Initial commit * Initial commit * feat: set up the project * 부산대 BE_김태윤_2주차 과제 (0단계 구현) (#86) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(3단계) (#414) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 * docs(README.md) : 3단계 - 위시 리스트 구현할 기능 목록들 정리 * feat : HandlerMethodArgumentResolver 구현 * feat : 위시 리스트 CRUD 기능 구현 --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(1,2단계) (#369) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 --------- Co-authored-by: 박재성(Jason) * refactor : globalhandler는 하나여야 한다. * feat: set up the project * feat : 3주차 - step0 구현 * docs(README.md) : 3주차 1단계 구현할 기능 목록 정리 * feat : spring data jpa 의존성 추가 * feat : 지금까지 작성한 JdbcTemplate 기반 코드를 JPA 기반 코드로 리팩토링 * 부산대 BE_김태윤 3주차 과제 (0단계) (#36) * Initial commit * feat: set up the project * 부산대 BE_김태윤_2주차 과제 (0단계 구현) (#86) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(3단계) (#414) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 * docs(README.md) : 3단계 - 위시 리스트 구현할 기능 목록들 정리 * feat : HandlerMethodArgumentResolver 구현 * feat : 위시 리스트 CRUD 기능 구현 --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(1,2단계) (#369) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 --------- Co-authored-by: 박재성(Jason) * refactor : globalhandler는 하나여야 한다. * feat : 3주차 - step0 구현 --------- Co-authored-by: 박재성(Jason) * feat : 회원가입 및 로그인 E2E test 구현 * refactor : JPA 리팩토링 에러 해결 * feat : @DataJpaTest 활용하여 wishlist CRUD 테스트 * refactor : service interface 생성 및 불필요한 파일들 삭제 * refactor : 전체적인 리팩토링 완료 * refactor : reformat code 적용 * docs(REAME.md) : 3주차 - 2단계 구현할 기능 목록 정리 * feat : 테이블 고려하여 엔티티 설계 * refactor : 회원가입/로그인 로직 리팩토링 * refactor : 디렉토리 구조 변경 * refactor : 사용자의 위시리스트 추가, 삭제, 조회하는 로직 리팩토링 * test : 상품 CRUD 테스트 통과 * test : 사용자의 위시리스트 추가, 삭제, 조회 로직 테스트 통과 * feat : 양방향 연관관계 적극 활용하기 * 부산대 BE_김태윤 3주차 과제 (1단계) (#220) * Initial commit * feat: set up the project * 부산대 BE_김태윤_2주차 과제 (0단계 구현) (#86) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(3단계) (#414) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 * docs(README.md) : 3단계 - 위시 리스트 구현할 기능 목록들 정리 * feat : HandlerMethodArgumentResolver 구현 * feat : 위시 리스트 CRUD 기능 구현 --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(1,2단계) (#369) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 --------- Co-authored-by: 박재성(Jason) * refactor : globalhandler는 하나여야 한다. * feat : 3주차 - step0 구현 * docs(README.md) : 3주차 1단계 구현할 기능 목록 정리 * feat : spring data jpa 의존성 추가 * feat : 지금까지 작성한 JdbcTemplate 기반 코드를 JPA 기반 코드로 리팩토링 * feat : 회원가입 및 로그인 E2E test 구현 * refactor : JPA 리팩토링 에러 해결 * feat : @DataJpaTest 활용하여 wishlist CRUD 테스트 * refactor : service interface 생성 및 불필요한 파일들 삭제 * refactor : 전체적인 리팩토링 완료 --------- Co-authored-by: 박재성(Jason) * feat : conflict 해결! * docs(README.md) : 3주차 3단계 - 페이지네이션 구현할 기능 목록 정리 * feat : wish list 페이지네이션 구현 * feat : product list 페이지네이션 구현 * test : 페이지네이션 테스트 구현 * refactor : Getmapping에 대해 동일한 url 매핑이 되어있는 에러 수정 --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 4주차 과제 (1단계) (#171) * docs(README.md) : 4주차 1단계 구현할 기능 목록 정리 * feat : 카테고리 : 상품 양방향 OneToMany 엔티티 설정 * feat : 카테고리 CRUD 구현 * feat : data.sql을 통해 카테고리 미리 설정하기 * feat : 관리자 화면에서 상품을 추가할 때 상품 카테고리 추가 기능 구현 * feat : 관리자 화면에서 상품을 수정할 때 상품 카테고리 수정 기능 구현 * test : 중복 검사 및 CRUD test 완료 * 부산대_BE 김태윤 4주차 과제 (2단계) (#360) * docs(README.md) : 4주차 1단계 구현할 기능 목록 정리 * feat : 카테고리 : 상품 양방향 OneToMany 엔티티 설정 * feat : 카테고리 CRUD 구현 * feat : data.sql을 통해 카테고리 미리 설정하기 * feat : 관리자 화면에서 상품을 추가할 때 상품 카테고리 추가 기능 구현 * feat : 관리자 화면에서 상품을 수정할 때 상품 카테고리 수정 기능 구현 * test : 중복 검사 및 CRUD test 완료 * docs(README.md) : 4주차 2단계 구현할 기능 목록들 추가 --------- Co-authored-by: azjaehyun <60067259+azjaehyun@users.noreply.github.com> * 부산대 BE_김태윤 4주차 과제 (2,3단계) (#391) * docs(README.md) : 4주차 1단계 구현할 기능 목록 정리 * feat : 카테고리 : 상품 양방향 OneToMany 엔티티 설정 * feat : 카테고리 CRUD 구현 * feat : data.sql을 통해 카테고리 미리 설정하기 * feat : 관리자 화면에서 상품을 추가할 때 상품 카테고리 추가 기능 구현 * feat : 관리자 화면에서 상품을 수정할 때 상품 카테고리 수정 기능 구현 * test : 중복 검사 및 CRUD test 완료 * docs(README.md) : 4주차 2단계 구현할 기능 목록들 추가 * feat : Option 엔티티 설계 * feat : 옵션 crud 구현 및 중복성 관리 구현 * feat : 옵션 페이지 구성 완료 * feat : 옵션 추가 페이지 구성 완료 * feat : 관리자 화면에서 옵션 추가/수정/삭제 기능 구현 * feat : subtract 메서드 구현 * test : 테스트 완료 * refactor : 멘토님 리뷰 반영하여 refactor * feat : 5주차 과제 step0 수행 - 2 * docs(REAME.md) : 5주차 1단계 구현할 기능 목록들 정리 * test : 인가 코드, 토큰 받기 * feat : step1 구현 완료 --------- Co-authored-by: 박재성(Jason) Co-authored-by: azjaehyun <60067259+azjaehyun@users.noreply.github.com> * 부산대 BE_김태윤_5주차 과제 (2단계) (#280) * Initial commit * feat: set up the project * 부산대 BE_김태윤 4주차 과제 (0단계) (#51) * Initial commit * Initial commit * feat: set up the project * 부산대 BE_김태윤_2주차 과제 (0단계 구현) (#86) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(3단계) (#414) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 * docs(README.md) : 3단계 - 위시 리스트 구현할 기능 목록들 정리 * feat : HandlerMethodArgumentResolver 구현 * feat : 위시 리스트 CRUD 기능 구현 --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(1,2단계) (#369) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 --------- Co-authored-by: 박재성(Jason) * refactor : globalhandler는 하나여야 한다. * feat: set up the project * feat : 3주차 - step0 구현 * docs(README.md) : 3주차 1단계 구현할 기능 목록 정리 * feat : spring data jpa 의존성 추가 * feat : 지금까지 작성한 JdbcTemplate 기반 코드를 JPA 기반 코드로 리팩토링 * 부산대 BE_김태윤 3주차 과제 (0단계) (#36) * Initial commit * feat: set up the project * 부산대 BE_김태윤_2주차 과제 (0단계 구현) (#86) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(3단계) (#414) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 * docs(README.md) : 3단계 - 위시 리스트 구현할 기능 목록들 정리 * feat : HandlerMethodArgumentResolver 구현 * feat : 위시 리스트 CRUD 기능 구현 --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(1,2단계) (#369) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 --------- Co-authored-by: 박재성(Jason) * refactor : globalhandler는 하나여야 한다. * feat : 3주차 - step0 구현 --------- Co-authored-by: 박재성(Jason) * feat : 회원가입 및 로그인 E2E test 구현 * refactor : JPA 리팩토링 에러 해결 * feat : @DataJpaTest 활용하여 wishlist CRUD 테스트 * refactor : service interface 생성 및 불필요한 파일들 삭제 * refactor : 전체적인 리팩토링 완료 * refactor : reformat code 적용 * docs(REAME.md) : 3주차 - 2단계 구현할 기능 목록 정리 * feat : 테이블 고려하여 엔티티 설계 * refactor : 회원가입/로그인 로직 리팩토링 * refactor : 디렉토리 구조 변경 * refactor : 사용자의 위시리스트 추가, 삭제, 조회하는 로직 리팩토링 * test : 상품 CRUD 테스트 통과 * test : 사용자의 위시리스트 추가, 삭제, 조회 로직 테스트 통과 * feat : 양방향 연관관계 적극 활용하기 * 부산대 BE_김태윤 3주차 과제 (1단계) (#220) * Initial commit * feat: set up the project * 부산대 BE_김태윤_2주차 과제 (0단계 구현) (#86) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(3단계) (#414) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 * docs(README.md) : 3단계 - 위시 리스트 구현할 기능 목록들 정리 * feat : HandlerMethodArgumentResolver 구현 * feat : 위시 리스트 CRUD 기능 구현 --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 2주차 과제(1,2단계) (#369) * Initial commit * feat: set up the project * feat : 1단계 상품 API 과제 수행 * feat : 2단계 상품을 CRUD할 수 있는 관리자 화면을 구현 * feat(README.md) : 구현할 기능 목록 정리 * feat : 상품 옵션 추가 기능 구현 및 전체적인 UI 변경 * feat(application.yml) : h2 DB 접속 정보 설정 * feat(build.gradle) : jdbc 의존성 추가 * feat(schema.sql) : DB 테이블 설계 * feat(ProductRepository.java) : JdbcTemplate을 활용하여 CRUD 구현 * feat : update servce 추가 * feat : 더 이상 Product 클래스를 JPA가 관리하지 않음 * docs : ExceptionHandler 구현 기능 목록 추가 * feat : 사용자 정의 Exception 구현 * feat : 발생 가능할 exception 상황 유추 및 처리 * feat : Global Exception 핸들러 구현 * feat : error 페이지 구현 * feat : 구현할 기능 목록들 모두 구현 완료 * refactor : 중복 처리 Exception 로직 수정 * refactor : UI 변경 및 CSS 코드 통합 * refactor : 유효성 검증 리팩토링 * feat : 2단계 - 관리자 화면 기능 목록 추가 * feat : 3단계 - 데이터베이스 적용 기능 목록 추가 * feat : DB 초기화 기능 구현 1. data.sql을 활용하여 초기 데이터 삽입 2. `spring.sql.init.mode : always` : 항상 SQL 데이터베이스를 초기화 * refactor : 이미 삽입된 데이터와 추가되는 데이터 간의 id값 충돌 해결 * feat : 1단계에서 작성한 테스트를 3단계 테스트 코드로 리팩토링 * feat : jacoco 설정 추가 및 코드 커버리지 확인 * feat : DeleteMapping으로 수정 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 * docs(README.md) : 2주차 0단계 과제 - 구현할 기능 목록 정리 및 수행 완료! * docs(README.md) : step1 구현할 기능 목록 정리 * feat(build.gradle) : spring-boot-starter-validation 의존성을 명시적으로 추가 * feat : 추가/수정하려는 상품에 대한 유효성 검사 및 예외 처리 구현 * feat : 전체적인 리팩토링 - 1 * feat : 전체적인 리팩토링 - 2 * feat : 인터페이스와 구현체 나누기 * docs(README.md) : 2단계 과제 (인증) 구현할 기능 목록 정리 * feat(build.gradle) : 라이브러리 설정 (spring security, jwt) * feat : 로그인 요청 및 응답 모델 클래스 설계 * feat : JWT 토큰 생성 및 검증하는 서비스 구현 * feat : 사용자 정보 로드하는 서비스 구현 * feat : jwt 토큰값 및 log 설정 * feat : Model 설계 * feat : Service 설계 * feat : Controller 설계 * docs(README.md) : step1 README.md 추가 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * docs(README.md) : 2단계 - 인증 구현할 기능 목록들 정리 * feat(build.gradle) : 2단계 - 라이브러리 추가 및 환경 설정 * feat : 2단계 - 회원가입 로직 구현 * refactor : 전체적인 리팩토링 * refactor : 전체적인 리팩토링 --------- Co-authored-by: 박재성(Jason) * refactor : globalhandler는 하나여야 한다. * feat : 3주차 - step0 구현 * docs(README.md) : 3주차 1단계 구현할 기능 목록 정리 * feat : spring data jpa 의존성 추가 * feat : 지금까지 작성한 JdbcTemplate 기반 코드를 JPA 기반 코드로 리팩토링 * feat : 회원가입 및 로그인 E2E test 구현 * refactor : JPA 리팩토링 에러 해결 * feat : @DataJpaTest 활용하여 wishlist CRUD 테스트 * refactor : service interface 생성 및 불필요한 파일들 삭제 * refactor : 전체적인 리팩토링 완료 --------- Co-authored-by: 박재성(Jason) * feat : conflict 해결! * docs(README.md) : 3주차 3단계 - 페이지네이션 구현할 기능 목록 정리 * feat : wish list 페이지네이션 구현 * feat : product list 페이지네이션 구현 * test : 페이지네이션 테스트 구현 * refactor : Getmapping에 대해 동일한 url 매핑이 되어있는 에러 수정 --------- Co-authored-by: 박재성(Jason) * 부산대 BE_김태윤 4주차 과제 (1단계) (#171) * docs(README.md) : 4주차 1단계 구현할 기능 목록 정리 * feat : 카테고리 : 상품 양방향 OneToMany 엔티티 설정 * feat : 카테고리 CRUD 구현 * feat : data.sql을 통해 카테고리 미리 설정하기 * feat : 관리자 화면에서 상품을 추가할 때 상품 카테고리 추가 기능 구현 * feat : 관리자 화면에서 상품을 수정할 때 상품 카테고리 수정 기능 구현 * test : 중복 검사 및 CRUD test 완료 * 부산대_BE 김태윤 4주차 과제 (2단계) (#360) * docs(README.md) : 4주차 1단계 구현할 기능 목록 정리 * feat : 카테고리 : 상품 양방향 OneToMany 엔티티 설정 * feat : 카테고리 CRUD 구현 * feat : data.sql을 통해 카테고리 미리 설정하기 * feat : 관리자 화면에서 상품을 추가할 때 상품 카테고리 추가 기능 구현 * feat : 관리자 화면에서 상품을 수정할 때 상품 카테고리 수정 기능 구현 * test : 중복 검사 및 CRUD test 완료 * docs(README.md) : 4주차 2단계 구현할 기능 목록들 추가 --------- Co-authored-by: azjaehyun <60067259+azjaehyun@users.noreply.github.com> * 부산대 BE_김태윤 4주차 과제 (2,3단계) (#391) * docs(README.md) : 4주차 1단계 구현할 기능 목록 정리 * feat : 카테고리 : 상품 양방향 OneToMany 엔티티 설정 * feat : 카테고리 CRUD 구현 * feat : data.sql을 통해 카테고리 미리 설정하기 * feat : 관리자 화면에서 상품을 추가할 때 상품 카테고리 추가 기능 구현 * feat : 관리자 화면에서 상품을 수정할 때 상품 카테고리 수정 기능 구현 * test : 중복 검사 및 CRUD test 완료 * docs(README.md) : 4주차 2단계 구현할 기능 목록들 추가 * feat : Option 엔티티 설계 * feat : 옵션 crud 구현 및 중복성 관리 구현 * feat : 옵션 페이지 구성 완료 * feat : 옵션 추가 페이지 구성 완료 * feat : 관리자 화면에서 옵션 추가/수정/삭제 기능 구현 * feat : subtract 메서드 구현 * test : 테스트 완료 * refactor : 멘토님 리뷰 반영하여 refactor * feat : 5주차 과제 step0 수행 - 2 * docs(REAME.md) : 5주차 1단계 구현할 기능 목록들 정리 * test : 인가 코드, 토큰 받기 * feat : step1 구현 완료 * docs(README.md) : 2단계 구현할 기능 목록들 정리 * feat : 상품 옵션 추량 차감 및 위시 리스트 삭제 구현 * feat : 카카오 로그인을 통해 액세스 토큰과 사용자 정보 받기 * feat : 토큰과 사용자 이름 DB에 저장하기 * feat : 주문 내역을 카카오톡 메시지로 전송하기 구현 * feat : 주문 내역 속 상품이 위시 리스트에 있는 경우 위시 리스트에서 삭제하는 기능 구현 * refactor : 옵션 페이지 및 옵션 이름 오류 해결 * feat : accessToken 유효성 검사 및 재발급 로직 추가 * test : accessToken 유효성 검사 및 재발급 로직 테스트 완료! * refactor : 간단한 오류 수정 --------- Co-authored-by: 박재성(Jason) Co-authored-by: azjaehyun <60067259+azjaehyun@users.noreply.github.com> * 부산대 BE_김태윤 5주차 과제 (3단계) (#376) * docs(README.md) : 5주차 - 3단계 구현할 기능 목록등 정리 * feat : RestClient에 timeout 설정하기 * refactor : 멘토님 리뷰 반영 * feat : timeout 설정 * feat : springdoc-openapi의 swagger를 이용해 swagger 구현 * feat : 회원 API 명세서 작성 성공 * feat : 카테고리 API 명세서 작성 성공 * feat : 상품 API 명세서 작성 성공 * feat : 상품 옵션 API 명세서 작성 성공 * feat : 위시리스트 API 명세서 작성 성공 * feat : 주문 API 명세서 작성 성공 * docs(README.md) : 6주차 0단계 * feat : 회원 API 구현 완료 * feat : 카테고리 API 구현 완료 * feat : 상품 API 구현 완료 * feat : 상품 옵션 API 구현 완료 * feat : 위시 리스트 API 구현 완료 * feat : 주문 API 구현 완료 * feat : 목 데이터 왕창 삽입하기 * feat : CORS 설정 구현 * feat : 토큰값 넣어주기 * 테스트 잠시 멈추기 * 코드 추가하기 * feat : 테이블 데이터 추가하기 * feat : 카테고리별 상품 조회 API 구현 * feat : data.sql에 데이터 추가 * feat : Wish 테이블에 createdDate 추가 * refactor : 주문하기, 위시리스트 API 리팩토링 * feat : CORS 설정 테스트 추가 * refactor : 테스트 코드 리팩토링 * 테스트코드 가리기 * CORS 설정 재설정하기 * 충돌 해결 * 충돌 해결 * docs(README.md) : 리드미 파일 수정 * docs(README.md) : 리드미 파일 수정 2 * docs(README.md) : 리드미 파일 수정 3 * feat : 쉘 스크립트 추가 * test : 쉘 스크립트 테스트용 * feat : 쉘 스크립터 작성 완료 * feat : 쉘 스크립터 수정 * Save local changes before pulling * feat : 6주차 2단계 구현 완료 * feat : 회원가입 API 수정하기 * feat : 회원별 포인트 조회하는 API 구현 * feat : 주문하기 API 수정하기 * refcator : 주문하기 API 리팩토링 - 1 * refactor : 토큰 만료기간 재설정 * refactor : 비밀키 길이 수정 * refactor : 토큰 길이 수정 - 2 * refactor : jwtUtil 수정 * refactor : jwtUtil 수정 - 2 * refactor : 2단계 멘토님 리뷰 반영 * refactor : 2단계 멘토님 리뷰 반영 - 2 * refactor : 주문하기 로직 리팩토링 * refactor : 주문하기 로직 리팩토링 - 2 * feat : orderPageResponse에 product 내용 좀 더 풍부하게 담기 * feat : 회원가입하지 않은 사용자 404 NOT FOUDN ERROR 띄우기 --------- Co-authored-by: 박재성(Jason) Co-authored-by: azjaehyun <60067259+azjaehyun@users.noreply.github.com> Co-authored-by: Ubuntu --- README.md | 19 +--- build.gradle | 65 +------------ src/main/java/gift/common/auth/JwtUtil.java | 37 ++++++-- .../auth/LoginMemberArgumentResolver.java | 2 +- .../member/controller/MemberController.java | 38 ++++++-- .../java/gift/member/dto/PointResponse.java | 10 ++ src/main/java/gift/member/model/Member.java | 24 +++++ .../gift/member/service/MemberService.java | 6 +- .../member/service/MemberServiceImpl.java | 49 +++++----- .../repository/OptionJpaRepository.java | 3 - .../option/repository/OptionRepository.java | 11 +++ .../repository/OptionRepositoryImpl.java | 27 ++++++ .../gift/option/service/OptionService.java | 4 +- .../order/controller/OrderController.java | 18 ++-- src/main/java/gift/order/domain/Order.java | 37 ++++++++ .../gift/order/dto/OrderPageResponse.java | 16 ++++ .../java/gift/order/dto/OrderRequest.java | 9 ++ .../java/gift/order/dto/OrderResponse.java | 47 ++++++++- .../java/gift/order/service/OrderService.java | 95 ++++++++++++++----- .../product/repository/ProductRepository.java | 2 +- .../gift/product/service/ProductService.java | 13 ++- .../gift/wish/controller/WishController.java | 10 +- .../java/gift/wish/service/WishService.java | 2 +- .../gift/wish/service/WishServiceImpl.java | 6 +- src/main/resources/application.yml | 7 +- 25 files changed, 381 insertions(+), 176 deletions(-) create mode 100644 src/main/java/gift/member/dto/PointResponse.java create mode 100644 src/main/java/gift/option/repository/OptionRepository.java create mode 100644 src/main/java/gift/option/repository/OptionRepositoryImpl.java create mode 100644 src/main/java/gift/order/dto/OrderPageResponse.java diff --git a/README.md b/README.md index 426efe8c8..bebbd37a4 100644 --- a/README.md +++ b/README.md @@ -40,12 +40,6 @@ - [x] CORS 설정하기 - [x] CORS 설정 테스트 -## https 통신을 위한 설정 -- [ ] DuckDns를 이용하여 도메인 설정하기 -- [ ] Nginx를 이용하여 https 설정하기 -- [ ] Cerbot을 이용하여 SSL 인증서 발급하기 -- [ ] OpenSSL을 이용하여 SSL 인증서 발급하기 - --- # 6주차 3단계 구현해야할 기능 목록들 정리 ## 1. 회원가입 API 수정하기 @@ -59,14 +53,7 @@ - [x] 포인트가 상품 금액의 50%를 넘지 않는지 검증하는 로직 추가 - [x] 사용자는 구매한 상품의 5%를 포인트로 적립받는다. - [x] 반환받은 포인트값 업데이트하기 - - +- [x] jwt 토큰 길이 수정 (512비트 이상으로) + - 현재 발생하고 있는 오류는 JWT 토큰을 검증하기 위한 키가 HS512 알고리즘에 대해 충분히 안전하지 않기 때문이다. + - JWT JWA 명세서(RFC 7518, 섹션 3.2)에 따르면, HS512와 함께 사용되는 키는 최소 512비트 이상이어야 한다. --- -# 6주차 4단계 구현해야할 기능 목록들 정리 -### 추가적으로 생각해봐야 할 API들 -- 카카오 로그인 API -- 특정 카테고리 조회, 새로운 카테고리 추가, 카테고리 삭제 API -- 옵션 추가 및 삭제 API -- 주문 추가 API -- 상품 추가, 상품 정보 수정, 상품 삭제 API - diff --git a/build.gradle b/build.gradle index 5aeacdb26..b74b5e7e7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,12 @@ plugins { id 'java' id 'org.springframework.boot' version '3.3.1' - id 'io.spring.dependency-management' version '1.1.4' // 버전까지 추가해줘야함 - + id 'io.spring.dependency-management' version '1.1.4' // id 'jacoco' +} +tasks.bootJar { + archiveFileName.set("spring-gift-1.0-SNAPSHOT.jar") // 자바 빌드 후 jar 파일명 명확히 기재 } group = 'camp.nextstep.edu' @@ -38,63 +40,6 @@ dependencies { } test { - //finalizedBy jacocoTestReport + // finalizedBy jacocoTestReport useJUnitPlatform() } - - -//jacoco { -// toolVersion = "0.8.10" -// reportsDirectory = layout.buildDirectory.dir('jacocoReport') -//} -// -// -//jacocoTestReport { -// -// dependsOn test -// -// reports { -// xml.required = false -// csv.required = false -// html.required = true -// } -// -// afterEvaluate { -// classDirectories.setFrom( -// files(classDirectories.files.collect { -// fileTree(dir: it, excludes: [ -// '**/domain/**', -// '**/global/**', -// '**/*Application*' -// ]) -// }) -// ) -// } -// finalizedBy 'jacocoTestCoverageVerification' -//} - -/* -jacocoTestCoverageVerification { - violationRules { - rule { - enabled = true - element = 'CLASS' - - // 라인 커버리지 제한을 90%로 설정 - limit { - counter = 'LINE' - value = 'COVEREDRATIO' - minimum = 0.90 - } - - excludes = [ - '**.*Application', - '**.domain.**', - '**.global.**' - - ] - } - - } -} -*/ diff --git a/src/main/java/gift/common/auth/JwtUtil.java b/src/main/java/gift/common/auth/JwtUtil.java index f23e22c87..7659fe8a3 100644 --- a/src/main/java/gift/common/auth/JwtUtil.java +++ b/src/main/java/gift/common/auth/JwtUtil.java @@ -1,23 +1,27 @@ package gift.common.auth; +import gift.member.model.Member; import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtException; import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import java.nio.charset.StandardCharsets; -import java.security.Key; +import javax.crypto.SecretKey; +import java.util.Date; @Component public class JwtUtil { - private final Key key; + private final SecretKey key; + private final long expirationTime; - public JwtUtil(@Value("${jwt.secret}") String secretKey) { - this.key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8)); + public JwtUtil(@Value("${jwt.secret}") String secretKey, @Value("${jwt.expiration}") long expirationTime) { + this.key = Keys.hmacShaKeyFor(secretKey.getBytes()); + this.expirationTime = expirationTime; } - // JWT 토큰을 파싱하여 그 안에 포함된 클레임을 반환 public Claims extractClaims(String token) { return Jwts.parser() @@ -27,7 +31,7 @@ public Claims extractClaims(String token) { .getBody(); } - // 토큰이 유효한지 확인 + // 토큰 유효성 검사 public boolean isTokenValid(String token) { try { Jwts.parser() @@ -35,7 +39,7 @@ public boolean isTokenValid(String token) { .build() .parseClaimsJws(token); return true; - } catch (Exception e) { + } catch (JwtException e) { e.printStackTrace(); return false; } @@ -46,4 +50,21 @@ public String extractEmail(String token) { Claims claims = extractClaims(token); return claims.get("email", String.class); } + + // 헤더값에서 토큰 추출하기 (Bearer 제거) + public String extractToken(String authorizationHeader) { + return authorizationHeader.startsWith("Bearer ") ? authorizationHeader.substring(7) : null; + } + + + // JWT 생성 + public String generateToken(Member member) { + return Jwts.builder() + .setSubject(member.getId().toString()) + .claim("email", member.getEmail()) // 이메일 클레임 추가 + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + expirationTime)) + .signWith(SignatureAlgorithm.HS512, key) + .compact(); + } } diff --git a/src/main/java/gift/common/auth/LoginMemberArgumentResolver.java b/src/main/java/gift/common/auth/LoginMemberArgumentResolver.java index 072e80407..f70673eed 100644 --- a/src/main/java/gift/common/auth/LoginMemberArgumentResolver.java +++ b/src/main/java/gift/common/auth/LoginMemberArgumentResolver.java @@ -41,7 +41,7 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m } // JWT 토큰 검증 - String token = header.substring(7); // "Bearer " 접두사 제거 + String token = jwtUtil.extractToken(header); if (!jwtUtil.isTokenValid(token)) { throw new UserNotFoundException("Invalid JWT token"); } diff --git a/src/main/java/gift/member/controller/MemberController.java b/src/main/java/gift/member/controller/MemberController.java index c4be3a36a..abdf0d161 100644 --- a/src/main/java/gift/member/controller/MemberController.java +++ b/src/main/java/gift/member/controller/MemberController.java @@ -1,20 +1,16 @@ package gift.member.controller; +import gift.common.auth.JwtUtil; import gift.common.util.CommonResponse; -import gift.member.dto.LoginRequest; -import gift.member.dto.LoginResponse; -import gift.member.dto.SignUpReqeust; -import gift.member.dto.SignUpResponse; +import gift.member.dto.*; import gift.member.service.MemberService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/members") @@ -22,9 +18,11 @@ public class MemberController { private final MemberService memberService; + private final JwtUtil jwtUtil; - public MemberController(MemberService memberService) { + public MemberController(MemberService memberService, JwtUtil jwtUtil) { this.memberService = memberService; + this.jwtUtil = jwtUtil; } // 회원가입 @@ -51,11 +49,31 @@ public ResponseEntity login(@Valid @RequestBody LoginRequest request) { String token = memberService.login(email, password); if (token == null) { - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Invalid email or password"); // 403 Forbidden + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("회원가입하지 않은 사용자입니다."); // 403 Forbidden } LoginResponse response = new LoginResponse(email, token); return ResponseEntity.ok(new CommonResponse<>(response, "로그인 후 토큰 발기 성공", true)); } + + // 특정 회원의 포인트 조회 + @Operation(summary = "포인트 조회", description = "특정 회원의 포인트를 조회한다.") + @GetMapping("/points") + public ResponseEntity getPoint( + @Parameter(hidden = true) @RequestHeader("Authorization") String authorizationHeader + ) { + // 토큰 추출 + String token = jwtUtil.extractToken(authorizationHeader); + if (token == null || !jwtUtil.isTokenValid(token)) { + // 401 Unauthorized + return ResponseEntity.status(401).body(new CommonResponse<>(null, "Invalid or missing token", false)); + } + System.out.println("KKKKtoken = " + token); + String memberEmail = jwtUtil.extractEmail(token); + System.out.println("KKKKmemberEmail = " + memberEmail); + Long points = memberService.getPoint(memberEmail); + + return ResponseEntity.ok(new CommonResponse<>(new PointResponse(points), "포인트 조회 성공", true)); + } } diff --git a/src/main/java/gift/member/dto/PointResponse.java b/src/main/java/gift/member/dto/PointResponse.java new file mode 100644 index 000000000..eef82272d --- /dev/null +++ b/src/main/java/gift/member/dto/PointResponse.java @@ -0,0 +1,10 @@ +package gift.member.dto; + +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; + +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public record PointResponse( + Long points +) { +} diff --git a/src/main/java/gift/member/model/Member.java b/src/main/java/gift/member/model/Member.java index 99daca0a2..ea4f4d3bc 100644 --- a/src/main/java/gift/member/model/Member.java +++ b/src/main/java/gift/member/model/Member.java @@ -25,10 +25,20 @@ public class Member { @Column(nullable = false) private String password; + private Long points; + @OneToMany(mappedBy = "member", cascade = CascadeType.REMOVE, orphanRemoval = true) private List wishList = new ArrayList<>(); // 활용 메서드들 + public void addPoints(Long points) { + this.points += points; + } + + public void subtractPoints(Long points) { + this.points -= points; + } + public void addWish(Wish wish) { this.wishList.add(wish); wish.setMember(this); @@ -58,6 +68,12 @@ public Member(String email, String password) { this.password = password; } + public Member(String email, String password, Long points) { + this.email = email; + this.password = password; + this.points = points; + } + // Getters and setters public Long getId() { return id; @@ -90,4 +106,12 @@ public List getWishList() { public void setWishList(List wishList) { this.wishList = wishList; } + + public Long getPoints() { + return points; + } + + public void setPoints(Long points) { + this.points = points; + } } diff --git a/src/main/java/gift/member/service/MemberService.java b/src/main/java/gift/member/service/MemberService.java index dbb0d3363..b844d38b2 100644 --- a/src/main/java/gift/member/service/MemberService.java +++ b/src/main/java/gift/member/service/MemberService.java @@ -6,7 +6,9 @@ public interface MemberService { void registerMember(String email, String password); - String generateToken(Member member); - String login(String email, String password); + + Long getPoint(String memberEmail); + + Member getMemberByToken(String token); } diff --git a/src/main/java/gift/member/service/MemberServiceImpl.java b/src/main/java/gift/member/service/MemberServiceImpl.java index 135ad646b..4b60419e6 100644 --- a/src/main/java/gift/member/service/MemberServiceImpl.java +++ b/src/main/java/gift/member/service/MemberServiceImpl.java @@ -1,29 +1,26 @@ package gift.member.service; +import gift.common.auth.JwtUtil; import gift.member.model.Member; import gift.member.repository.MemberRepository; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.security.Keys; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import java.nio.charset.StandardCharsets; -import java.util.Date; import java.util.Optional; -import java.security.Key; @Service public class MemberServiceImpl implements MemberService { private final MemberRepository memberRepository; - private final Key key; + private final JwtUtil jwtUtil; - public MemberServiceImpl(MemberRepository memberRepository, @Value("${jwt.secret}") String secretKey) { + public MemberServiceImpl(MemberRepository memberRepository, JwtUtil jwtUtil) { this.memberRepository = memberRepository; - this.key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8)); + this.jwtUtil = jwtUtil; } + // 회원가입 public void registerMember(String email, String password) { - Member member = new Member(email, password); + // 신규 회원은 3000포인트를 부여 + Member member = new Member(email, password, 3000L); Optional existingMember = memberRepository.findByEmail(email); // validation @@ -34,25 +31,31 @@ public void registerMember(String email, String password) { memberRepository.save(member); } - public String generateToken(Member member) { - return Jwts.builder() - .setSubject(member.getId().toString()) - .claim("email", member.getEmail()) // 이메일 클레임 추가 - .setIssuedAt(new Date()) - .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1시간 만료 - .signWith(key) - .compact(); + // 로그인 + public String login(String email, String password) { + Member member = memberRepository.findByEmail(email).orElse(null); + if (member == null || !member.getPassword().equals(password)) { + return null; + } + + return jwtUtil.generateToken(member); } - public String login(String email, String password) { + // 포인트 조회 + public Long getPoint(String email) { Member member = memberRepository.findByEmail(email).orElseThrow( () -> new IllegalArgumentException("No such member: ") ); - if (!member.getPassword().equals(password)) { - return null; - } + return member.getPoints(); + } - return generateToken(member); + // 토큰으로 사용자 정보 조회하기 + public Member getMemberByToken(String token) { + String email = jwtUtil.extractEmail(token); + + return memberRepository.findByEmail(email).orElseThrow( + () -> new IllegalArgumentException("토큰값에 해당하는 사용자 없음!!!") + ); } } diff --git a/src/main/java/gift/option/repository/OptionJpaRepository.java b/src/main/java/gift/option/repository/OptionJpaRepository.java index 05f55f366..b244cc227 100644 --- a/src/main/java/gift/option/repository/OptionJpaRepository.java +++ b/src/main/java/gift/option/repository/OptionJpaRepository.java @@ -11,7 +11,4 @@ @Repository public interface OptionJpaRepository extends JpaRepository { List