Home - comento-backend-camp/ticket-reservation-server-hyejung GitHub Wiki

์•„๋ž˜ ๋ฌธ์„œ๋Š” notion์— ์ž‘์„ฑํ•œ API ์„ค๊ณ„๋ฅผ ๋ณต์‚ฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

User Level API

POST /api/sigup

body๋กœ ๋ฐ›์€ ์ด๋ฉ”์ผ์„ ์‚ฌ์šฉ์ž ์ •๋ณด์— ๋“ฑ๋กํ•œ๋‹ค.

๋“ฑ๋ก๋œ ์ด๋ฉ”์ผ ์ •๋ณด๋Š” ๊ณต์—ฐ ์ขŒ์„ ์˜ˆ์•ฝ ์‹œ ์‚ฌ์šฉ๋œ๋‹ค.

์‚ฌ์šฉ์ž ๋“ฑ๋ก

201 : ์ด๋ฉ”์ผ ๋“ฑ๋ก ์„ฑ๊ณต์‹œ, ๋“ฑ๋ก์— ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
400 : String type์ด ์•„๋‹Œ parameter๋ฅผ ์š”์ฒญ์œผ๋กœ ๋ฐ›์„ ๊ฒฝ์šฐ 400 ์—๋Ÿฌ(์ž˜๋ชป๋œ ์š”์ฒญ)๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. 
500 : DB ๋ฌธ์ œ, ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ 500 ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

GET /api/performance/info/?date="์˜ค๋Š˜ ๋‚ ์งœ"

parameter๋กœ ๋ฐ›์€ ๋‚ ์งœ ๊ธฐ์ค€ ์ดํ›„์˜ ๊ณต์—ฐ ์ •๋ณด๋ฅผ ๋‚ ์งœ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜์—ฌ ์กฐํšŒํ•œ๋‹ค.

๊ณต์—ฐ์ผ์ด ์ง€๋‚œ ๊ณต์—ฐ์„ ์กฐํšŒํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์˜ˆ์•ฝ๋„ ๋ถˆ๊ฐ€ํ•˜๋‹ค.

๊ณต์—ฐ์€ '์ œ๋ชฉ, ๊ณต์—ฐ์ผ, ๊ฐ€๊ฒฉ, ์ƒ์„ธ์ •๋ณด'๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค.

๊ณต์—ฐ ์ •๋ณด ์กฐํšŒ

200 : ๊ณต์—ฐ ์ •๋ณด ์กฐํšŒ ์„ฑ๊ณต ์‹œ, ๊ณต์—ฐ ์ •๋ณด๋ฅผ ๋‹ด์•„๋†“์€ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜์—ฌ Listํ˜•ํƒœ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
400 : ์˜ค๋Š˜(2021-09-04) ์ด์ „์˜ ๋‚ ์งœ์˜ ๊ฒฝ์šฐ, 400 ์—๋Ÿฌ(์ž˜๋ชป๋œ ์š”์ฒญ)์„ ์ „๋‹ฌํ•œ๋‹ค.
404 : ๊ณต์—ฐ ์ •๋ณด ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ, 404 ์—๋Ÿฌ(์š”์ฒญ ์ •๋ณด ์—†์Œ)์„ ์ „๋‹ฌํ•œ๋‹ค. 
500 : DB ๋ฌธ์ œ, ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ 500 ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

GET /api/performance/info/seat/?date="๋‚ ์งœ"&title="๊ณต์—ฐ์ด๋ฆ„"

parameter๋กœ ๋ฐ›์€ ๋‚ ์งœ์™€ ๊ณต์—ฐ์ด๋ฆ„์„ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ๊ณต์—ฐ์˜ ์„ ํƒ ๊ฐ€๋Šฅํ•œ ์ขŒ์„ ์ •๋ณด๋ฅผ ๋‚ ์งœ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์กฐํšŒํ•œ๋‹ค.

๋“ฑ๋ก๋œ ์ด๋ฉ”์ผ ์ •๋ณด๋Š” ๊ณต์—ฐ ์ขŒ์„ ์˜ˆ์•ฝ ์‹œ ์‚ฌ์šฉ๋œ๋‹ค.

๊ณต์—ฐ ์ขŒ์„ ์ •๋ณด ์กฐํšŒ

200 : ์š”์ฒญ์— ๋Œ€ํ•œ ์ผ์น˜ํ•˜๋Š” ์ •๋ณด ์กฐํšŒ ์„ฑ๊ณต ์‹œ, ์กฐํšŒ ์„ฑ๊ณต ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ ์ขŒ์„ ์—ฌ๋ถ€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
400 : parameter 2๊ฐœ ์ค‘ 1๊ฐœ๋ผ๋„ String type์ด ์•„๋‹Œ ํƒ€์ž…์„ ์š”์ฒญ์œผ๋กœ ๋ฐ›์„ ๊ฒฝ์šฐ 400 ์—๋Ÿฌ(์ž˜๋ชป๋œ ์š”์ฒญ)๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. 
404 : ์š”์ฒญ์— ๋Œ€ํ•œ ์ผ์น˜ํ•˜๋Š” ์ •๋ณด ์กฐํšŒ ์‹คํŒจ ์‹œ, ์กฐํšŒ ์‹คํŒจ ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ 404 ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
500 : DB ๋ฌธ์ œ, ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ 500 ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

POST /api/performance/booking

body๋กœ ๋ฐ›์€ ๋‚ ์งœ์™€ ๊ณต์—ฐ์ด๋ฆ„, ์ด๋ฉ”์ผ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ๊ณต์—ฐ์˜ ์ขŒ์„์„ ์˜ˆ์•ฝํ•œ๋‹ค.

๊ณต์—ฐ ์ขŒ์„ ์ •๋ณด ์˜ˆ์•ฝ

201 : ์š”์ฒญ์— ๋Œ€ํ•œ ๊ณต์—ฐ ์ •๋ณด ์ขŒ์„์„ DB์— ์ถ”๊ฐ€ํ•˜๊ณ , ์„ฑ๊ณต ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ ์˜ˆ์•ฝํ•œ ์ขŒ์„ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
400 : ๋‚ ์งœ์™€ ๊ณต์—ฐ์ด๋ฆ„์ด 1๊ฐœ๋ผ๋„ null์ด๊ฑฐ๋‚˜ String type์ด ์•„๋‹Œ ํƒ€์ž…์„ ์š”์ฒญ์œผ๋กœ ๋ฐ›์„ ๊ฒฝ์šฐ 400 ์—๋Ÿฌ(์ž˜๋ชป๋œ ์š”์ฒญ)๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. 
401 : ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ ์ •๋ณด๊ฐ€ DB์— ์—†๋Š” ๊ฒฝ์šฐ, 401 ์—๋Ÿฌ(์ธ์ฆ ๊ถŒํ•œ ์—†์Œ)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 
409 : ์š”์ฒญ์— ๋Œ€ํ•œ ๊ณต์—ฐ ์ขŒ์„์„ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ(์˜ˆ์•ฝ์ด ๋œ), ์‹คํŒจ ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ 409 ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
500 : DB ๋ฌธ์ œ, ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ 500 ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

GET /api/performance/booking/email/{์ด๋ฉ”์ผ}

parameter๋กœ ๋ฐ›์€ ์ด๋ฉ”์ผ์„ ์ด์šฉํ•˜์—ฌ ๋ณธ์ธ์ด ์˜ˆ์•ฝํ•œ ๊ณต์—ฐ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

๊ณต์—ฐ ์ขŒ์„ ์ •๋ณด ์˜ˆ์•ฝ ์กฐํšŒ

200 : ์š”์ฒญ์— ๋Œ€ํ•œ ์ผ์น˜ํ•˜๋Š” ์ •๋ณด ์กฐํšŒ ์„ฑ๊ณต ์‹œ, ์กฐํšŒ ์„ฑ๊ณต ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ ์˜ˆ์•ฝ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
400 : parameter๊ฐ€ ์ด๋ฉ”์ผ ํ˜•์‹์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ String type์ด ์•„๋‹Œ ํƒ€์ž…์„ ์š”์ฒญ์œผ๋กœ ๋ฐ›์„ ๊ฒฝ์šฐ 400 ์—๋Ÿฌ(์ž˜๋ชป๋œ ์š”์ฒญ)๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. 
401 : ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ ์ •๋ณด๊ฐ€ DB์— ์—†๋Š” ๊ฒฝ์šฐ, 401 ์—๋Ÿฌ(์ธ์ฆ ๊ถŒํ•œ ์—†์Œ)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 
404 : ์š”์ฒญ์— ๋Œ€ํ•œ ์ผ์น˜ํ•˜๋Š” ์ •๋ณด ์กฐํšŒ ์‹คํŒจ ์‹œ, ์กฐํšŒ ์‹คํŒจ ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ 404 ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
500 : DB ๋ฌธ์ œ, ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ 500 ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

System Level API

1. Controller Layer

/*
 * ApiController.java
 */ 

//์ด๋ฉ”์ผ ๋“ฑ๋ก
public ResponseEntity<T> addEmail(@RequestBody String email);

//๋ฐ›์€ ๋‚ ์งœ ์ดํ›„์˜ ๊ณต์—ฐ ์ •๋ณด๋“ค ๋ณด์—ฌ์ฃผ๊ธฐ
public ResponseEntity<T> showPerformanceInfo(@RequestParam(value = "date", required = true) Date date);

//๋ฐ›์€ ๋‚ ์งœ์™€ ๊ณต์—ฐ ์ด๋ฆ„์œผ๋กœ ํ•ด๋‹น ๊ณต์—ฐ ์ขŒ์„ ์ •๋ณด ๋ณด์—ฌ์ฃผ๊ธฐ
public ResponseEntity<T> showPerformanceSeat(@RequestParam(value = "date", required = true) Date date, @RequestParam(value = "title", required = true) String title)

//๊ณต์—ฐ ์ขŒ์„ ์˜ˆ์•ฝํ•˜๊ธฐ
public ResponseEntity<T> addBooking(@RequestBody BookingDto reqBooking)

//๊ณต์—ฐ ์˜ˆ์•ฝ ์ •๋ณด ํ™•์ธํ•˜๊ธฐ
public ResponseEntity<T> showMyBooking(@PathVariable String email);

2. Service Layer

/*
 * UserService.java
 */
public User saveUser(User user);
public Optional<User> verifyEmail(String email);

/*
 * PerformanceService.java
 */
public List<Performance> getListByDate(Date date);
public List<Performance> getListByDateAndTitle(Date date, String title);

/*
 * BookingService.java
 */
public Booking saveBookging(BookingDto reqBooking);
public Optional<Booking> getMyBooking(String email);

3. Repository

/*
 * UserRepository.java
 */
Optional<User> findByEmail(String email);
User save(User user);

/*
 * PerformanceRepository.java
 */
List<Performance> findByDateGraterThenOrderBydateAsc(Date date);
List<Performance> findByDateConstainsAndTitleOrderByDateAsc(Date date, String title);
List<Performance> findAll();

/*
 * BookingRepository.java
 */
Optional<Booking> findByUser(User user);
Booking save(Booking booking);

4. Domain & Dto Layer

/*
 *  Entity
 */
public class User{
		private Long id;
		private String email;
}

public class Performance{
		private Long id;
		private String title;
		private Date date;
		private Long price;
		private String description;
}

public class Booking{
		private Long id;
		private User user;
		private Performance performance;
}

/*
 *  Dto
 */
public class BookingDto{
		private Date date;
		private String title;
		private String email;
}
โš ๏ธ **GitHub.com Fallback** โš ๏ธ