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

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

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

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

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

intelliJ

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);

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자 이내, 한글/영문/숫자 허용

Postman

2. 어드민 로그인
관리자 인증을 위한 로그인 API입니다.
Postman

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

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

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

intelliJ

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..."
}

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

Postman

로그인으로 토큰 생성이 되었습니다.
728x90
반응형
'API > 실습' 카테고리의 다른 글
55. [ JAVA ] API 문서 문제 : JWT(Json Web Token)(보안) / Admin(2) (1) | 2025.01.11 |
---|---|
53. [ JAVA ] Spring Boot를 이용한 API 통신 : 뉴스 검색 예시 (1) | 2025.01.11 |
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 |
42. [ JAVA ] API 문서 문제 : review_db (1) (3) | 2024.12.25 |