API/실습

48. [ JAVA ] API 문서 문제 : JWT(Json Web Token)(보안) / Admin(1)

천재단미 2025. 1. 6. 18:06
728x90
반응형

 

 

목차 ▽열기

 

 

 

문제

 

어드민 API 명세서

 

1. 어드민 회원가입

 

관리자 권한을 가진 사용자를 등록하는 API입니다.

  • URL: /api/v1/admin/signup
  • Method: POST
  • 설명:
    • 관리자 계정을 생성합니다.
    • foodreview.com 도메인의 이메일만 회원가입이 가능합니다.
    • 자동으로 'ADMIN' 권한이 부여됩니다.
  • Request Body:
{
    "email": "admin@foodreview.com",
    "password": "Admin123!@#",
    "nickname": "시스템관리자"
}

  • Validation:
    • email: @foodreview.com 도메인만 허용
    • password: 최소 10자 이상, 영문 대/소문자/숫자/특수문자 모두 포함 필수
    • nickname: 2-20자 이내, 한글/영문/숫자 허용
  • Response:
    • 201

2. 어드민 로그인

 

관리자 인증을 위한 로그인 API입니다.

  • URL: /api/v1/admin/login
  • Method: POST
  • 설명:
    • 관리자 계정으로 로그인합니다.
  • Request Body:
{
    "email": "admin@foodreview.com",
    "password": "Admin123!@#"
}

  • Response:
{
    "token": "eyJhbGciOiJIUzI1NiJ9..."
}

 

3. 상위 리뷰어 목록

 

서비스의 핵심 사용자인 상위 리뷰어들의 정보를 제공합니다. 리뷰어 수(size)를 쿼리파라미터로 보냅니다.

설명

  • 리뷰 작성 수 기준으로 상위 사용자들을 식별합니다.
  • 각 리뷰어의 평균 평점과 최근 활동 정보를 함께 제공합니다.
  • 이 데이터를 통해 서비스의 핵심 사용자들의 특성을 파악할 수 있습니다.

활용 방안

  • VIP 사용자 관리
  • 우수 리뷰어 보상 프로그램 운영
  • 인플루언서 마케팅 대상 선정
  • URL: /api/v1/admin/crm/users/top-reviewers?size=5
  • Method: GET
  • 헤더에 토큰 필수
  • Response 예시와 설명:
{
    "topReviewers": [
        {
            "userId": 3,
            "nickname": "맛있는생활",
            "reviewCount": 50,      // 전체 리뷰 작성 수
            "averageRating": 4.2,   // 평균 평점
            "lastReviewDate": "2024-02-27"  // 최근 리뷰 작성일
        },
        {
            "userId": 21,
            "nickname": "리뷰짱",
            "reviewCount": 39,      // 전체 리뷰 작성 수
            "averageRating": 3.8,   // 평균 평점
            "lastReviewDate": "2024-02-21"  // 최근 리뷰 작성일
        }
    ]
}

2. 기간별 리뷰 통계

지정된 기간 동안의 리뷰 작성 현황과 평점을 분석합니다.

설명

  • 일자별, 카테고리별 리뷰 작성 추이를 파악할 수 있습니다.
  • 전체 평균 평점과 카테고리별 평균 평점을 비교할 수 있습니다.
  • 특정 기간의 리뷰 트렌드를 분석할 수 있습니다.

활용 방안

  • 서비스 성과 모니터링
  • 카테고리별 인기도 분석
  • 시즌별 트렌드 파악
  • URL: /api/v1/admin/crm/reviews/stats
  • Method: GET
  • 헤더에 토큰 필수
  • Query Parameters:
startDate: 조회 시작일 (필수)
endDate: 조회 종료일 (필수)

  • Response:
{
    "total": {
        "reviewCount": 1000,
        "averageRating": 4.3
    },
    "byDate": [
        {
            "date": "2024-02-27",
            "reviewCount": 50,
            "averageRating": 4.2
        },
        {
            "date": "2024-02-28",
            "reviewCount": 32,
            "averageRating": 4.4
        }
    ],
    "byCategory": [
        {
            "category": "한식",
            "reviewCount": 400,
            "averageRating": 4.4
        },
        {
            "category": "중식",
            "reviewCount": 500,
            "averageRating": 4.1
        }
    ]
}

5. 인기 음식점 통계

리뷰 수와 평점을 기준으로 인기 음식점을 분석합니다.

설명

  • 리뷰 수와 평점을 기준으로 인기 음식점을 식별합니다.
  • 카테고리별 통계를 통해 각 분야의 인기 업체를 파악할 수 있습니다.
  • 최근 리뷰 일자를 통해 지속적인 인기도를 확인할 수 있습니다.

활용 방안

  • 추천 음식점 선정
  • 카테고리별 벤치마킹 업체 선정
  • 우수 음식점 마케팅 프로모션
  • URL: /api/v1/admin/crm/restaurants/popular
  • Method: GET
  • 헤더에 토큰 필수
  • Query Parameters:
category: 음식점 카테고리 (선택)
minReviews: 최소 리뷰 수 (선택)

  • Response:
{
    "topRestaurants": [
        {
            "id": 3,
            "name": "맛있는 식당",
            "category": "한식",
            "reviewCount": 100,
            "averageRating": 4.5,
            "lastReviewDate": "2024-02-27"
        },
        {
            "id": 1,
            "name": "한상차림",
            "category": "중식",
            "reviewCount": 210,
            "averageRating": 4.4,
            "lastReviewDate": "2024-02-11"
        }
    ]
}

공통 사항

데이터 기준

  • 모든 통계는 실제 데이터베이스 테이블의 데이터를 기반으로 합니다.
  • USER, RESTAURANT, REVIEW 테이블의 데이터를 활용합니다.
  • 날짜/시간은 각 테이블의 created_at 컬럼을 기준으로 합니다.

성능 고려사항

  • 대량의 데이터 조회 시 페이징 처리가 필요할 수 있습니다.

인증 및 권한

  • 모든 API는 어드민 권한을 가진 사용자만 접근 가능합니다.
  • Authorization 헤더에 유효한 어드민 토큰이 필요합니다.

에러 처리

  • 잘못된 요청: 400 Bad Request
  • 서버 에러: 500 Internal Server Error

데이터 신뢰성

  • 모든 통계는 실시간 데이터를 기반으로 합니다.

 

풀이

 

- 토큰 관련 초기 세팅 

 

45. [ JAVA ] JWT(Json Web Token)(보안) 기초 세팅

JWT(Json Web Token)에 대하여 알아보았았습니다.   intelliJ 위와 같이 Postman 에서 로그인을 진행하면  token이 발행될 수 있도록  intelliJ에서 초기 작업을 진행하도록 하겠습니다.  초기 세팅을

danmi1109.tistory.com

 

1. 어드민 회원가입

관리자 권한을 가진 사용자를 등록하는 API입니다.

 

 

Postman

 

스크린샷 2025-01-06 오후 4

 

 

intelliJ

 

  • URL: /api/v1/admin/signup
  • Method: POST
  • 설명:
    • 관리자 계정을 생성합니다.
    • foodreview.com 도메인의 이메일만 회원가입이 가능합니다.
    • 자동으로 'ADMIN' 권한이 부여됩니다.
스크린샷 2025-01-06 오후 5

 

signUp(@RequestBody UserRequest userRequest){
        int result = userService.signUp(userRequest);

 

스크린샷 2025-01-06 오후 5

 

package com.example.foodadmin.entity;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
    public long id;
    public String email;
    public String password;
    public String nickname;
    public String role;
    public String createdAt;


}

 

스크린샷 2025-01-06 오후 5

 

    public ReviewerListResponse getTopReviewers(String token, int size) {
        jwtConfig.getTokenClaims(token.substring(7)).getSubject();
        List<ReviewerResponse> reviewerList = crmDAO.getTopReviewers(token, size);
        return new ReviewerListResponse(reviewerList);

    }

 

 

DBeaver

 

스크린샷 2025-01-06 오후 5

 

 

intelliJ

 

스크린샷 2025-01-06 오후 5

 

    public int signUp(UserRequest userRequest){
        String sql = "INSERT INTO user (email, password, nickname, role)\n" +
                "values ( ? , ? , ? , 'ADMIN');";
        return jdbcTemplate.update(sql,
                userRequest.email,
                userRequest.password,
                userRequest.nickname);

 

스크린샷 2025-01-06 오후 5

 

package com.example.foodadmin.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class UserRequest {

    public String email;
    public String password;
    public String nickname;

}

 

  • Request Body:
{
    "email": "admin@foodreview.com",
    "password": "Admin123!@#",
    "nickname": "시스템관리자"
}

  • Validation:
    • email: @foodreview.com 도메인만 허용
    • password: 최소 10자 이상, 영문 대/소문자/숫자/특수문자 모두 포함 필수
    • nickname: 2-20자 이내, 한글/영문/숫자 허용
스크린샷 2025-01-06 오후 5

 

 

Postman

 

스크린샷 2025-01-06 오후 5

2. 어드민 로그인

관리자 인증을 위한 로그인 API입니다.

 

 

Postman

 

스크린샷 2025-01-12 오후 10

  • URL: /api/v1/admin/login
  • Method: POST
  • 설명:
    • 관리자 계정으로 로그인합니다.

 

intelliJ

 

스크린샷 2025-01-06 오후 5

 

login(@RequestBody UserRequest userRequest) {
        // 로그인 로직
        Object result = userService.login(userRequest);

 

스크린샷 2025-01-06 오후 5

 

    public Object login(UserRequest userRequest) {

        // 1. 이메일 형식이 올바른지 체크
        if( EmailValidator.isValidEmail( userRequest.email ) == false ){
            return 1;
        }
        // 2. DB 로 부터 데이터를 가져온다.
        // 3. 유저가 없는지 확인
        try {
            User user = userDAO.login(userRequest);

        // 4. 비밀번호가 일치하는지 체크
            if( passwordEncoder.matches(userRequest.password, user.password) == false ){
                return 3;
            }

        // 5. jwt 토큰 생성하여 반환한다.
            String token = jwtConfig.createToken(user.id);
            return token;

        } catch (Exception e) {
            return 2;
        }
    }
  • Request Body:
{
    "email": "admin@foodreview.com",
    "password": "Admin123!@#"
}

 

 

 

DBeaver

 

 

스크린샷 2025-01-06 오후 6

 

 

 

intelliJ

스크린샷 2025-01-06 오후 6

    public User login(UserRequest userRequest){
        String sql = "select *\n" +
                "from user\n" +
                "where email = ? and role = 'ADMIN';";
        return jdbcTemplate.queryForObject(sql, new UserRowMapper(), userRequest.email);
    }

    public static class UserRowMapper implements RowMapper<User>{

        @Override
        public User mapRow(ResultSet rs, int rowNum) throws SQLException {
            User user = new User();
            user.id = rs.getLong("id");
            user.email = rs.getString("email");
            user.password = rs.getString("password");
            user.nickname = rs.getString("nickname");
            user.role = rs.getString("role");
            user.createdAt = rs.getString("created_at");
            return user;
        }
    }

 

  • Response:
{
    "token": "eyJhbGciOiJIUzI1NiJ9..."
}

스크린샷 2025-01-06 오후 5

package com.example.foodadmin.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class UserLoginResponse {
    public String token;


}

 

Response:

  • 201

스크린샷 2025-01-06 오후 5

 

 

Postman

 

스크린샷 2025-01-12 오후 10

 

로그인으로 토큰 생성이 되었습니다. 

728x90
반응형
home
}