f-lab-edu / unique-auction Goto Github PK
View Code? Open in Web Editor NEW거래 플랫폼 Springboot 프로젝트 (Docker, Kafka, Redis, etc.)
거래 플랫폼 Springboot 프로젝트 (Docker, Kafka, Redis, etc.)
POST
http://localhost:8080/users
{
"isAdmin" : false,
"email" : "[email protected]",
"password": "helloworld1@",
"username": "abcd",
"phone": "01012341234"
}
2xx or 4xx
구매등록 validation 실패하는 현상
재현하기 위한 스텝을 상세히 기록해 주세요
POST http://localhost:8080/purchase
{
"userId": 1123,
"productId": 1123,
"size": 1,
"productSize": "1",
"bidPrice": "1000",
"shippingAddress": "1adsf"
}
200 ok
2022-11-11 16:34:47.296 ERROR 19830 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.lang.Long'. Check configuration for 'productId'] with root cause
BASE Entity 구성
각 도메인 공통 필드를 포함하는 BASE Entity 구성
테스트 를 작성할때 협력객체를 명시하지않는 테스트가 있어서
추가해주고 부족한 테스트부분도 보완해준다
현재 프로젝트를 Ncloud 배포 및 실행한다.
master 브랜치에 푸쉬될경우에만 , ncloud 에 배포되도록
githubAction And Ncloud SourceDeploy(배포,자동실행)기능을 이용한다
현재는 유니크 키를 주고 동시성 문제를 처리하는데 비용이 많이든다
애플리케이션 코드선에서 처리하는법으로 한다.
자료를 좀더 찾아봐야겠지만
멀티스레드 환경에서 Lock 키워드로 문제해결 방향을 잡아야 될거같다.
목표
Product API 테스트 코드 작성 .
방법
컨트롤러 , 서비스 테스트 코드를 만들어서
코드 검증을 좀 더 명확히 한다.
application을 로컬에서 실행하기 위애 의존성있는 인프라가 구축되어 있어야 합니다.
실제 운영환경을 생각해보면 이미 인프라가 모두 갖춰져 있는 상태에서 변경된 소스코드로 빌드된 에플리케이션을 배포합니다.
이와 같은 구조를 만들어 주기 위해서 로컬에서 실행하는 docker compose 파일에는 의존성이 있는 인프라(mysql)만 만들어 줍니다.
에플리케이션 실행은 IDE에서 run
, debug
기능을 통해서 실행해 줍니다.
개발 편의성에서도 차이가 납니다. build, docer restart할 필요가 없어집니다.
as-is:
로컬에서 build -> docker 재실행 -> postman 등으로 테스트 -> 코드수정 -> (반복) build -> docker 재실행
to-be:
docker 실행 -> run (debug) -> -> postman 등으로 테스트 -> 코드수정 -> rerun (debug)
docker compose 에서 application:
부분 제거
목표
유저는 상품을 리뷰할 수 있다.
별점을 줄 수 있다 1~5점
리뷰를 남길 수 있다. 문자열 - 최대 N글자
목표
구매 / 판매 API 구현
방법
목표
이번 작업단위가 너무 크다고 생각하는 경우 다른 issue로 나누어 작업해주세요
JoinRequest -> user로 변형시 plain text가 encodedPassword로 들어갑니다.
이어서 바로 암호화를 한다고하더라도 순간적으로 plain text로 들어가는것은 사실입니다.
개발자의 부주의로 이 데이터를 그대로 사용할수도 있어서 원천 차단할 필요가 있습니다.
목표
분리되어있는 Exception 통일하기
#14 (comment)
방법
asis : LoginException, UserException, ProductException... 처럼 예외가 분리되어있음
tobe :
이점이 없기에 하나의 컨트롤어드바이스 커스텀익셉션으로 통합
회원 회원가입 API 개발
목표
상품 생성 , 조회 , 변경 , 삭제에 대한 API 를 구현한다.
방법
REST API 규칙을 최대한 지키면서 개발한다.
상품 조회 , 변경 , 삭제 시 상품 ID값을 넘겨주고
조회 , 변경 , 삭제를 한다,
상품 검색을위한 api도 개발한다.
회원 가입시 동시성 이슈가 발생할수 있다.
이 문제를 해결하기위해 코드를 수정 해보자
해당 내용을 찾아보고 적절한 내용을 코드에 반영한다.
Describe the bug
버그는 아님. 개선사항
목표
ddl을 spring에서 초기화 하는 용도로 사용하지 않고
docker로 mysql이 올라갈때 실행하는 방식으로 변경하기.
as-is : docker에서 실행된 mysql은 테이블이 하나도 없는 비어있는 상태이고, application 이 실행되면서 초기화 한다.
to-be : docker에서 mysql을 올릴때 ddl을 사용해 초기화한다. application이 실행될때는 이미 만들어져 있는 DB에 붙어서
실행되는 구조.
방법
설정 spring.sql.init.mode
제거.
spring:
sql:
init:
mode: always
목표
Trade 및 UserService 로직 강화
방법
Trade 및 UserService 로직 강화
목표
Spring Data JPA 적용
방법
findAll()은 db의 모든 데이터를 조회합니다.
특히 시간이 지남에 따라 수가 계속 증가하는 성질이 있는 데이터인 경우.
이 기능은 매우매우 위험 합니다. 절대로 사용하면 안되는 기능입니다.
findAll 없이 기능을 구현해주세요~
Describe the bug
현재 로직상 회원가입을하면 유저가 아무도 없는데
등록이 된다 나온다 , 서비스 쪽 분기 에서 로직이 잘못된거같다.
유저가 등록을 할시 role 필드에서 0이 저장된다 . JPA 필드처리 관련해서 수정.
etc
Entity field (테이블 클래스) 관련
String 필드가 많아서 익숙한듯 그냥 넘어 가기 쉬운 경우가있다
이넘 필드 같은 경우 우리가 원하는 스트링 데이터가 들어갈 수 있도록 어노테이션을 따로지정해주는듯 ( 지정안해주면 어노테이션 필드 순서인 인트가 들어감)
스트링 필드외에 다른필드 선언시 다른 변수가 없는지 테스트를 하고 체크를해야 된다.
리뷰등록 api 동작하지않음
재현하기 위한 스텝을 상세히 기록해 주세요
POST http://localhost:8080/reviews
{
"userId": 1123,
"productId": 1,
"score": 1,
"content": "일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십"
}
2022-11-11 16:40:26.486 ERROR 19830 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com.uniqueauction.web.review.request.SaveReviewRequest]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.uniqueauction.web.review.request.SaveReviewRequest
(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
위 이슈가 해결되었다고 가정하더라도 아래 이슈가 발생합니다.
유저가 없는경우 response가 아래처럼 출력됩니다.
{
"success": false,
"error": {
"errorCode": "not_found_user",
"errorMessage": "가입하지 않은 이메일이거나 잘못된 비밀번호입니다."
}
}
유저의 id나 password를 입력하지 않았기때문에 적절하지 않습니다.
목표
네이버 코드컨벤션 파일등록
방법
파일 다운받아 콘피크에 적용
목표
회원가입
방법
user insert
주의사항
해결 과정에서 주의해야할 사항이 있다면 작성해주세요.
etc
추가적으로 알아야할 내용을 작성해주세요.
목표
어떤 내용을 개발할지 적어주세요.
방법
목표를 이루기 위한 해결 방법을 대략적으로 설명 해주세요.
->
대안
위 방법 외에 대안이 있으면 작성해주세요.
주의사항
해결 과정에서 주의해야할 사항이 있다면 작성해주세요.
etc
추가적으로 알아야할 내용을 작성해주세요.
목표
기존 이메일 폰 어노테이션등 어노테이션을 각 파라미터마다 따로만들어주는대
이를 하나로 통합해서 중복코드를 줄이고 한개의 커스텀 벨리데이션으로 여러 필드들을 관리할 수 있다
방법
enum으로
벨리데이션 메세지 , 정규식등을 추가해주고 커스텀어노테이션에 필요한값을 넣어주는식으로해서
중복을 줄인다.
애플리케이션 클라우드 환경 구축
네이버 클라우드 플랫폼(NCP) 를 활용하여 애플리케이션 및 데이터베이스 시스템 환경을 구축한다.
user service 등 service layer에서 request 객체를 그대로 사용하고있습니다 (=의존하고 있습니다)
지금 상태로는 api 인터페이스의 변경이 일어나면 service레이어의 소스코드도 수정되어야합니다.
이런 변경에도 service 레이어의 소스코드가 변경되지 않도록 의존성 관리를 해주세요~
@vymr1000 님이 고민해서 수정해주세요
목표
API 공통 Response 리팩토링
방법
API 공통 Response 리팩토링 (CommonResponse)
목표
현재 프로덕트에 있는 필드중 추가로 필요한 필드는 추가를 하고
사이즈 카테고리 등 필드를, 각 엔티티로 설계를 한다.
방법
size , image , category entity 생성
주의사항
클래스 설계 단계에서 후 디비 단계로 넘어갈때 놓치지 못한 이슈가 생길수 있다.
클래스 설계를 충분히 검토해서 작성한다.
목표
상품 검색 API 를 추가한다.
방법
기존 CRUD 에서 검색 API 추가 .
로컬환경과 운영환경으로 분리한다.
현재까지 개발완료된 API로 문서를 최신화한다.
위키 문서 수정.
목표
즉시구매 / 즉시판매 구현
방법
리뷰 트레이드 테스트 코드 작성 및
기존 테스트코드 실패할 경우 등 추가
github action을 이용햐여 CI 적용
PR없이 repote에 푸시된 브랜치는 돌아가지 않게 해주세요.
담당자 : @superkkj
로그인 관련 상태체크를 한다 현재 로그인 한 사람이 맞는지 다른사람인지 체크
목표
Github action CI Test Container 적용을 통해 CI 빌드 & 테스트 검증
방법
Github action CI Test Container 적용
너무 짧음
자세히 쓰기
to @superkkj
Describe the bug
github action에서 job이름이 설정되어 어떤 기능이 성공/실패 했는지 명확하게 알 수 있어야한다.
todo
job1, job2 처럼 되어있는 네이밍 변경
현재 상속으로 베이스 엔티티가 구현 되있다
허나 상속의 문제점으로 다중상속이 안됀다던지 만약
부모 클래스 변경으로인해 하위클래스 전부 변경이일어나는듯
문제점이 많아서 이를
컴포지션으로 구현을 다시해 상속에 대한 문제점을 해결한다.
Describe the bug
ValidationCheckAspect
쪽도 수정 부탁드립니다.
public void validaiontCheck(ProceedingJoinPoint proceedingJoinPoint) throws Throwable
이벤트리스너로 리뷰 등록을 처리 하고 있다
의존성은 약해지지만 코드 구현부분이 복잡해서 다른 방법을 대안을 찾아보자.
이벤트리스너는 의존성을 약하게 하는등 사용이유가 있지만 .
로직 처리후 후속작업을 더해야되는역할? 등 으로 사용되는경우가 더 많은거 같다.
관련된 이슈 번호
요약
변경사항 (할 일)
목표
docker redis 환경을 구축해 세션 저장방법을 개선
방법
도커에 리디스 설치후 적용한다
로컬 , 릴리즈에 따라
도커 컴포즈 안에 환경설정이 바뀌게 한다.
savePurchase
에서는 purchase
만 저장.sale
을 매칭해서 trade
생성로컬환경과 운영환경으로 분리한다.
목표
request 객체가 service, repository layer까지 오면 안됩니다.
방법
controller 에서 entity로 변환해서 service에 전달하기.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.