
목차 ▽열기
1. 문제
API 명세서
1. User API
1.1. 사용자 등록
- URL: /users
- Method: POST
- Request Body:
- { "username": "john_doe", "email": "john.doe@example.com", "password": "securepassword" }
- Response:
- 201 Created:
- { "id": 1 }
1.2. 사용자 상세 조회 (주문 내역 포함)
- URL: /users/{id}
- Method: GET
- Response:
- 200 OK:
- { "id": 1, "username": "john_doe", "email": "john.doe@example.com", "created_at": "2024-12-20T10:00:00Z", "orders": [ { "order_id": 1, "product_name": "Smartphone", "price": 1000000, "order_date": "2024-12-20T12:00:00Z" }, { "order_id": 2, "product_name": "Laptop", "price": 2000000, "order_date": "2024-12-21T14:00:00Z" } ] }
- 404 Not Found: 해당 사용자가 존재하지 않을 경우.
2. Product API
2.1. 제품 등록
- URL: /products
- Method: POST
- Request Body:
- { "name": "Smartphone", "price": 1000000 }
- Response:
- 201 Created:
- { "id": 1 }
2.2. 제품 목록 조회
- URL: /products
- Method: GET
- Query Parameters:
- page (선택, 기본값: 1): 조회할 페이지 번호.
- size (선택, 기본값: 10): 페이지당 데이터 개수.
- Response:
- 200 OK:
- { "total_count": 25, "page": 1, "size": 10, "items": [ { "id": 1, "name": "Smartphone", "price": 1000000, "created_at": "2024-12-20T10:00:00Z" }, { "id": 2, "name": "Laptop", "price": 2000000, "created_at": "2024-12-20T11:00:00Z" } ] }
2.3. 제품 상세 조회
- URL: /products/{id}
- Method: GET
- Response:
- 200 OK:
- { "id": 1, "name": "Smartphone", "price": 1000000, "created_at": "2024-12-20T10:00:00Z" }
- 404 Not Found: 해당 제품이 존재하지 않을 경우.
3. Order API
3.1. 주문 생성
- URL: /orders
- Method: POST
- Request Body:
- { "user_id": 1, "product_id": 2 }
- Response:
- 201 Created:
- { "id": 1 }
3.2. 주문 목록 조회
- URL: /orders
- Method: GET
- Query Parameters:
- page (선택, 기본값: 1): 조회할 페이지 번호.
- size (선택, 기본값: 10): 페이지당 데이터 개수.
- Response:
- 200 OK:
- { "total_count": 15, "page": 1, "size": 10, "items": [ { "id": 1, "user": { "id": 1, "username": "john_doe", "email": "john.doe@example.com" }, "product": { "id": 2, "name": "Laptop", "price": 2000000 }, "order_date": "2024-12-20T12:00:00Z" } ] }
3.3. 주문 상세 조회
- URL: /orders/{id}
- Method: GET
- Response:
- 200 OK:
- { "id": 1, "user": { "id": 1, "username": "john_doe", "email": "john.doe@example.com" }, "product": { "id": 2, "name": "Laptop", "price": 2000000 }, "order_date": "2024-12-20T12:00:00Z" }
- 404 Not Found: 해당 주문이 존재하지 않을 경우.
3.4. 주문 삭제
- URL: /orders/{id}
- Method: DELETE
- Response:
- 204 No Content (Body 없음).
2. 풀이
https://danmi1109.tistory.com/46
40. [ JAVA ] 서버 API 문제 풀이 : 초기 세팅
문제 풀이를 하기전에 초기 세팅 방법에 대하여 알아보겠습니다.문제풀이에 필요한 프로그램 및 사이트는 DBeaver,Spring Boot,Gibhubdp, intelliJ ,putty입니다. DBeaver DBeaver 실행후 새로운 Databases생성
danmi1109.tistory.com
초기세팅

DBeaver와 intelliJ 를 데이터 베이스의 내용에 맞게 설계 해줍니다.
DBeaver
- Databases이름 : revisews_db
- 테이블명 : 1. users
2. products
3. reviews
- 컬럼 세팅
- PK키 세팅
1. reviews의 product_id 와 product의 id
2. reviews의 user_id 와 users의 id
- 첨부된 샘플 데이터 입력하기






intelliJ
- entity 패키지 생성
- 클래스 생성 : 1. Users
2. Products
3. Reviews
- 생성자별로 초기화 및 getter와 setter 생성





- controller 패키지, dao 패키지 생성
- 클래스 생성 : UserController , UserDAO
- UserCOntroller @RestController 어노테이션 생성
- service 패키지 생성
- 클래스 생성 : UserService
- UserService @Service 어노테이션 생성
- UserController
@RestController public class UserController { @Autowired UserService userService; |

@Repository public class UserDAO { @Autowired JdbcTemplate jdbcTemplate; |

@Service public class UserService { @Autowired UserDAO userDAO; |

1.1 회원가입
새로운 사용자를 시스템에 등록합니다. 이메일 중복 확인을 수행하며, 비밀번호는 암호화하여 저장합니다.
- 설명:
- 이메일은 유효한 이메일 형식이어야 합니다.
- 비밀번호는 최소 8자 이상이어야 합니다.
- 닉네임은 2자 이상 30자 이하여야 합니다.
- 이미 등록된 이메일로는 가입할 수 없습니다.

- Status Code:
- 201: 회원가입 성공
- 400: 잘못된 요청 (이메일 형식 불일치 등)
- 409: 이메일 중복
Postman
- 새로운 collection 생성 : User Server
- request 추가 생성 : 회원 가입 API
- URL : http://localhost:8080/api/users
- Boby -> row -> Json 타입
{
"email": "user@example.com",
"password": "password123",
"nickName": "홍길동"
}
|

intelliJ
- dto 패키지 생성
- UserRequst 클래스 생성
- request 에서 요청하는 메소드 생성
- 생성자별로 초기화 및 getter와 setter 생성
package com.example.review.dto; public class UserRequest { private String email; private String password; private String nickName; public UserRequest(String email, String password, String nickName) { this.email = email; this.password = password; this.nickName = nickName; } public UserRequest() { } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } } |

DBeaver
- 회원가입 하는 sql 확인

intelliJ
- DBeaver에 복사한 UserDAO sql 생성
public int createUser(UserRequest userRequest){ String sql = "INSERT INTO users(email, password, nickname)\n" + " VALUES (?, ?, ?);"; return jdbcTemplate.update(sql,userRequest.getEmail(),userRequest.getPassword(),userRequest.getNickName()); } |

{ "status": "success" } |
- dto 패키지
- 클래스 UserResponse 생성
- 생성자별로 초기화 및 getter와 setter 생성

- 설명:
- 이메일은 유효한 이메일 형식이어야 합니다.
- 비밀번호는 최소 8자 이상이어야 합니다.
- 닉네임은 2자 이상 30자 이하여야 합니다.
- 이미 등록된 이메일로는 가입할 수 없습니다.
- UserSevice
@PostMapping("api/users") public ResponseEntity createUser(@RequestBody UserRequest userRequest) { int result = userService.createUser(userRequest); if (result == 0) { return ResponseEntity.status(201).body(new UserResponse("success")); } else if (result == 1 || result == 2 || result == 3) { return ResponseEntity.status(400).build(); } else if (result == 4) { return ResponseEntity.status(409).build(); }else{ return ResponseEntity.status(500).build(); } } |

Status Code:
- 201: 회원가입 성공
- 400: 잘못된 요청 (이메일 형식 불일치 등)
- 409: 이메일 중복
- UserController
@PostMapping("api/users") public ResponseEntity createUser(@RequestBody UserRequest userRequest) { int result = userService.createUser(userRequest); if (result == 0) { return ResponseEntity.status(201).body(new UserResponse("success")); } else if (result == 1 || result == 2 || result == 3) { return ResponseEntity.status(400).build(); } else if (result == 4) { return ResponseEntity.status(409).build(); }else{ return ResponseEntity.status(500).build(); } } |

Postman

1.2 로그인
등록된 사용자의 로그인을 처리합니다. 이메일과 비밀번호를 검증합니다.
- 설명:
- 등록된 이메일과 비밀번호가 일치하는지 확인합니다.
- 이메일이나 패스워드가 없으면, 잘못된 요청으로 처리
- 이메일이나 비밀번호가 일치하지 않으면, 401로 처리
- URL: /api/users/login
- Method: POST
- Request Body:
{ "email": "user@example.com", "password": "password123" } |
- Response:
{ "status": "success" } |
- Status Code:
- 200: 로그인 성공
- 400: 잘못된 요청
- 401: 로그인 실패
Postman
- 새로운 collection 생성 : User Server
- request 추가 생성 : 회원 가입 API
- URL : http://localhost:8080/api/users/login

- Request Body:
{ "email": "user@example.com", "password": "password123" } |
DBeaver
- 로그인 확인 하는 sql 확인

intelliJ
- UserDAO 복사하여 sql 생성
public int loginUser(UserRequest userRequest){ String sql = "SELECT* \n " + "FROM `users`\n" + "WHERE email = ? and PASSWORD = ?;"; return jdbcTemplate.update(sql, new UserRowMapper()); } |

- 설명:
- 등록된 이메일과 비밀번호가 일치하는지 확인합니다.
- 이메일이나 패스워드가 없으면, 잘못된 요청으로 처리
- 이메일이나 비밀번호가 일치하지 않으면, 401로 처리
- UserSevice
public int loginUser(UserRequest userRequest){ if ( userRequest.getEmail() == null || userRequest.getEmail().isEmpty()){ return 1; } if (userRequest.getPassword() == null || userRequest.getPassword().isEmpty()){ return 2; } try { ]userDAO.loginUser(userRequest); } catch (Exception e) { return 0; } return 3; } } |
- Status Code:
- 200: 로그인 성공
- 400: 잘못된 요청
- 401: 로그인 실패
- UserController
@PostMapping("api/users/login") public ResponseEntity loginUser(@RequestBody UserRequest userRequest) { int result = userService.loginUser(userRequest); if (result == 0) { return ResponseEntity.status(200).body(new UserResponse("success")); } else if (result == 1 || result == 2) { return ResponseEntity.status(400).build(); }else if (result == 3){ return ResponseEntity.status(401).build(); }else { return ResponseEntity.status(500).build(); } } } |

Postman

package com.example.review.controller; import com.example.review.dto.UserRequest; import com.example.review.dto.UserResponse; import co m.example.review.service.UserService; import org.springframework.beans.factory.annotation.Autowired; 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.RestController; @RestController public class UserController { @Autowired UserService userService; @PostMapping("api/users") public ResponseEntity<UserResponse> createUser(@RequestBody UserRequest userRequest) { int result = userService.createUser(userRequest); if (result == 0) { return ResponseEntity.status(201).body(new UserResponse("success")); } else if (result == 1 || result == 2 || result == 3) { return ResponseEntity.status(400).build(); } else if (result == 4) { return ResponseEntity.status(409).build(); }else{ return ResponseEntity.status(500).build(); } } @PostMapping("api/users/login") public ResponseEntity<UserResponse> loginUser(@RequestBody UserRequest userRequest) { int result = userService.loginUser(userRequest); if (result == 0) { return ResponseEntity.status(200).body(new UserResponse("success")); } else if (result == 1 || result == 2) { return ResponseEntity.status(400).build(); }else if (result == 3){ return ResponseEntity.status(401).build(); }else { return ResponseEntity.status(500).build(); } } } |
package com.example.review.dao; import com.example.review.dto.UserRequest; import com.example.review.entity.Users; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import java.sql.ResultSet; import java.sql.SQLException; @Repository public class UserDAO { @Autowired JdbcTemplate jdbcTemplate; public int createUser(UserRequest userRequest){ String sql = "INSERT INTO users(email, password, nickname)\n" + " VALUES (?, ?, ?);"; return jdbcTemplate.update(sql,userRequest.getEmail(),userRequest.getPassword(),userRequest.getNickName()); } public int loginUser(UserRequest userRequest){ String sql = "SELECT* \n " + "FROM `users`\n" + "WHERE email = ? and PASSWORD = ?;"; return jdbcTemplate.update(sql, new UserRowMapper()); } public static class UserRowMapper implements RowMapper<Users> { @Override public Users mapRow(ResultSet rs, int rowNum) throws SQLException { Users users = new Users(); users.setId(rs.getInt("id")); users.setEmail(rs.getString("email")); users.setPassword(rs.getString("password")); users.setNickName(rs.getString("nickname")); users.setCreatedAt(rs.getString("created_at")); return users; } } |
package com.example.review.service; import com.example.review.dao.UserDAO; import com.example.review.dto.UserRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired UserDAO userDAO; // 이메일은 유효한 이메일 형식이어야 합니다. // 비밀번호는 최소 8자 이상이어야 합니다. // 닉네임은 2자 이상 30자 이하여야 합니다. public int createUser(UserRequest userRequest){ if ( userRequest.getEmail().contains("@") == false ){ return 1; } if (userRequest.getPassword().length() < 8){ return 2; } if (userRequest.getNickName().length() < 2 || userRequest.getNickName().length() > 30){ return 3; } try { userDAO.createUser(userRequest); return 0; } catch (Exception e){ return 4; } } // 등록된 이메일과 비밀번호가 일치하는지 확인합니다. // 비밀번호는 암호화된 값과 비교합니다. // 로그인 성공 시 사용자 정보를 반환합니다. public int loginUser(UserRequest userRequest){ if ( userRequest.getEmail() == null || userRequest.getEmail().isEmpty()){ return 1; } if (userRequest.getPassword() == null || userRequest.getPassword().isEmpty()){ return 2; } try { ]userDAO.loginUser(userRequest); } catch (Exception e) { return 0; } return 3; } } |
'API > 실습' 카테고리의 다른 글
53. [ JAVA ] Spring Boot를 이용한 API 통신 : 뉴스 검색 예시 (1) | 2025.01.11 |
---|---|
48. [ JAVA ] API 문서 문제 : JWT(Json Web Token)(보안) / Admin(1) (0) | 2025.01.06 |
47. [ JAVA ] API 문서 문제 : JWT(Json Web Token)(보안) / User (2) (0) | 2025.01.05 |
46. [ JAVA ] API 문서 문제 : JWT(Json Web Token)(보안) / User (1) (0) | 2025.01.04 |
41. [ JAVA ] API 문서 문제 : 유저 관리(sb-user-server) (0) | 2024.12.21 |