API/실습

42. [ JAVA ] API 문서 문제 : review_db (1)

천재단미 2024. 12. 25. 17:44
728x90
반응형

review_db

목차 ▽열기

 

 

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 == || 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 == || 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 == || 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 == || 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 == || 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;
        }
}

 

 
 
 

728x90
반응형
home
}