해커톤에 참여하여 음식 주문 관리 시스템을 만들게 되었습니다.
각자 가장 좋아하는 음식들을 골라 주문할 수 있는 시스템을 만들어주세요.
음식이 아니어도 괜찮아요!
- 메뉴 조회: 사용자는 본인이 주문 가능한 메뉴 정보를 볼 수 있습니다.
- 메뉴는 html 정적 페이지나 이미지를 통해 제공해주세요.
- 주문 조회: 사용자가 지금까지 추가한 주문들을 조회할 수 있습니다.
- 주문 추가: 사용자가 특정 음식을 선택해 주문할 수 있습니다.
- 주문 변경: 사용자가 특정 주문의 수량, 또는 옵션을 변경할 수 있습니다.
- 주문 취소: 특정 주문을 취소할 수 있습니다.
- 반환값은 DTO 클래스를 반환하도록 하며, 특히 최신 문법중 record를 활용해 만들어보세요
- API는 RESTFul하게 만들어 주세요.
- 컨트롤러, 서비스, 레포지토리, 엔티티 등 각 레이어를 적절하게 나누어주세요.
- JPA를 활용해주시고, 데이터베이스를 연동해주세요
- application.yml과 application-secret.yml을 분리해보세요.
- src/main/resources/static내에 html 파일을 두고, 컨트롤러를 통해 정적 페이지를 제공해주세요.
- RestController 가 아닌 일반 Controller를 사용해주세요.
- 심화적으로 MVC 패턴을 더 경험하고 싶으시다면, thymeleaf와 같은 템플릿을 사용하여도 됩니다!
- 개발은 각자의 깃허브 레포지토리에 진행해주세요! 초대 이후 링크를 저(coke98)에게 보여주시면 됩니다!
- 테이블을 여러개 두어도 괜찮지만(음식, 주문, 사용자 등 당연히 분리하는게 좋지만) 이번 실습에서는 여러 테이블간 연관관계가 맺어질 경우 난이도가 어려워질 수 있습니다! 주문이라는 한 테이블 내에 모든 내용(음식, 수량 등)이 들어가도록 테이블을 구성하는 것을 권장합니다!
- 테이블 분리: 기존에 "주문" 테이블에 모든 정보를 포함했던 것을 개선하여, 각 역할별로 테이블을 분리해 주세요.(필요에 따라 추가로 분리하여도 괜찮습니다!)
- 음식 테이블
- 주문 테이블
- 사용자 테이블
- 연관관계 매핑: JPA를 활용하여 각 테이블 간의 연관관계를 매핑하고, **매핑된 결과를 다이어그램(ERD)**으로 그려주세요. 설명을 함께 작성해주세요(관계 종류, 컬럼 등)
- 다이어그램 전용 무료 툴은 1. ERD-Diagram 2. draw.io 3. MysqlWorkbench를 추천드려요.
- 그 외에 툴도 연관관계와 테이블 컬럼을 알아 볼 수 있다면 괜찮습니다.
- API 확장
- 사용자 생성 API 추가 - 새로운 RestController를 생성하여 ****사용자를 추가할 수 있는 기능을 만들어주세요.
- Transaction 활용
- 서비스 코드 내에서 DB에 여러 차례 접근하는 메서드들에는 반드시 transaction을 활용해주세요.
- 깃허브 레포지토리 내에 이슈를 만들고 커밋과 PR에서 이슈를 트래킹 해주세요
- RESTAPI를 사용하지 않은 분들은 코드리뷰를 참고하여 json 포맷을 반환하도록 수정해주세요.
- DTO의 경우 response인지, request인지 구분할 수 있도록 네이밍을 고민해주세요.
지난주에 진행한 음식 주문 관리 시스템을 회원에게 제공하기 위해
이번 3주차 과제에서는 회원가입 API를 만들고,
로그인을 유지하는 작업을 진행해주세요. 😌
- 회원가입 기능 추가
- 새로운 사용자가 아이디(이메일), 비밀번호, 이름(닉네임) 등을 입력하여 회원가입할 수 있는 기능을 구현해주세요.
- REST API를 통해 구현해주세요
- 비밀번호는 반드시 암호화하여 DB에 저장해주세요. (예: BCrypt 등)
- 이미 존재하는 아이디로는 회원가입할 수 없도록 중복 검사를 해주세요.
- (선택, 난이도: ⭐️⭐️⭐️) 프로필 이미지를 함께 받아 저장할 수 있도록 해보시는걸 권장합니다. 이미지와 텍스트를 함께 받을 수 있는 방법을 고민해주세요. (힌트: formdata)
- 로그인 기능 구현
- 회원이 아이디와 비밀번호로 로그인할 수 있도록 로그인 기능을 구현해주세요.
- REST API를 통해 구현해주세요.
- 로그인에 성공하면 세션을 등록해 로그인을 유지해주세요.
- (선택, 난이도: ⭐️⭐️⭐️⭐️) 세션 대신 JWT를 사용해 개발하는 것도 좋습니다.
- 인증 및 인가 처리
- 로그인된 회원만 주문할 수 있도록 인증, 인가 처리를 구현해주세요.
- 자신의 주문 내역만 조회할 수 있도록 권한 처리를 해주세요.
- 세션 검증 로직은 서비스가 아닌 인터셉터를 통해 구현해주세요.
- 로그아웃 기능 추가
- 로그인 된 회원이 로그아웃할 수 있는 기능을 구현해주세요.
- REST API를 통해 구현해주세요.
- 로그아웃 시 세션을 만료시켜주세요.
- 깃허브 레포지토리 내에 이슈를 만들고 커밋과 PR에서 이슈를 트래킹 해주세요.
- 클래스 내에 너무 많은 책임이 들어가지 않도록 주의하여 작성해주세요.
- 암호화 로직의 경우 다른 클래스로 분리하는 등
- 한 메서드가 4줄이상 넘어가거나 들여쓰기(indent)가 3번이상이라면, 메서드내 책임을 분리할 수 있을지도 고민해주세요.
- 참고 키워드: (클린코드) 함수의 추상화 수준, (클린코드) 인덴트, 메서드 분리
- 메서드들의 private과 public 접근 제어자를 목적에따라 제대로 활용하고 있는지 확인해주세요.
- 이유없이 public으로 열어두지 않도록 주의해주세요.
- 실행 결과를 함께 남겨주세요
- Postman이나 API 테스트 툴을 통해 실행결과를 남겨주세요.
진행하시면서 어려운 점이 있으면 언제든지 질문해 주세요. 😊 각자의 깃허브 레포지토리에 진행한 내용을 PR로 남겨주시고, 완료되면 저를 리뷰어로 지정해주신 후 연락 남겨주세요!