spring_2기[본캠프]/과제

[과제] Spring e-Commerce back office Task Day 1

minwoo95 2026. 1. 14. 21:17

개발 담당 역할 필수구현 : 관리자정보관리 

3. 관리자 정보 관리

1️⃣ 목적

슈퍼 관리자가 등록된 관리자 계정을 조회, 수정, 삭제하고, 신규 관리자의 가입 신청을 승인 또는 거부할 수 있도록 합니다.

2️⃣ 요구사항

[관리자 리스트 조회]

다음 쿼리 파라미터를 지원해야 합니다.

  • 검색 키워드 (이름, 이메일)
  • 페이지 번호 (기본값: 1)
  • 페이지당 개수 (기본값: 10)
  • 정렬 기준 (예: 이름, 이메일, 가입일)
  • 정렬 순서 (asc, desc)
  • 역할 필터 (슈퍼 관리자, 운영 관리자, CS 관리자)
  • 상태 필터 (활성, 비활성, 정지, 승인대기, 거부)

응답에는 다음이 포함되어야 합니다.

  • 관리자 목록
    • 고유 식별자(ID), 이름, 이메일, 전화번호, 역할, 상태, 가입일, 승인일
  • 페이징 정보 (현재 페이지, 페이지당 개수, 전체 개수, 전체 페이지 수)

[관리자 상세 조회]

  • 특정 관리자의 상세 정보를 조회합니다.
    • 이름, 이메일, 전화번호, 역할, 상태, 가입일, 승인일
  • 존재하지 않는 ID 요청 시 에러를 반환합니다.

[관리자 정보 수정]

  • 수정 가능한 필드: 이름, 이메일, 전화번호

[관리자 역할 변경]

  • 관리자의 역할을 변경합니다.

[관리자 상태 변경]

  • 관리자의 상태를 변경합니다.

[관리자 삭제]

  • 특정 관리자를 탈퇴(삭제)시킵니다.

[관리자 승인/거부]

관리자 승인:

  • 승인대기 상태의 관리자를 활성 상태로 변경합니다.
  • 승인 일시 필드를 업데이트합니다.

관리자 거부:

  • 승인대기 상태의 관리자를 거부 상태로 변경합니다.
  • 거부 일시, 거부 사유 필드를 업데이트합니다.
  • 거부 사유는 필수 입력 항목입니다.

[내 프로필 조회]

  • 내(로그인한 유저) 프로필 정보를 조회할 수 있습니다.
    • 이름, 이메일, 전화번호

[내 프로필 수정]

  • 수정 가능한 필드: 이름, 이메일, 전화번호

[비밀번호 변경]

  • 현재 비밀번호를 새로운 비밀번호로 변경합니다.

 

1.깃 셋팅

2.자바 코드 컨벤션과 깃 커밋 컨벤션을 설정

자바 코드 컨벤션 - > 인텔리제이에 플러그인을 공동 셋팅하기

깃 브랜치 커밋 컨벤션

→ 개인은 핏: 구현한 기능 타이틀→깃 푸시하고→PR작성할때 PR템플릿 업데이트 후→올 리뷰 되면→dev 머지

→기존에 생성한 깃에 브랜치는 삭제→해당 로컬 브렌치 삭제

→모든 맴버가 개발이 끝나면 팀장님이 dev에서 main으로 머지

(모든 맴버가 한싸이클 돌때까지 다같이 참관하기→깃 세션 페이지 맨 하단 순서 참고 하는것으로)

 

3.각자 역할분담

이현석 1 관리자 회원가입 기능
유지현 2 관리자 인증 기능
전민우 3 관리자 정보 관리
서하나 4 고객 정보 관리
윤민기 5 상품 정보 관리

 

4.API명세서 작성

팀원들과 함께 API 명세서를 작성하였다.

 

[문제] 관리자 승인/거부의 API 에서 URL과 Request Response의 구성이 관리자 정보 수정과 겹쳐 어떻게 해야할지 고민이였다.

[해결]

[튜터님 피드백] RestFul한 API 작성을 위한 다양한 사이트를 공유해주셨고, 참고하여 API명세서를 깔끔하게 작성할수 있었다.

https://developer.spotify.com/documentation/web-api/tutorials/getting-started

https://www.freecodecamp.org/news/rest-api-best-practices-rest-endpoint-design-examples/

https://learn.microsoft.com/ko-kr/azure/architecture/best-practices/api-design

https://restfulapi.net/resource-naming/

 

REST API URI Naming Conventions and Best Practices

In REST, having a strong and consistent REST resource naming strategy – will prove one of the best design decisions in the long term. Let's discuss.

restfulapi.net

 

5.플로우차트 작성

무료 버전이라 크게는 다운로드가 불가능하다.. 아쉽다

 

6.ERD 작성하기

 

7.최종 역할 분담

 

개발 시작

팀원들 모두 적극적으로 참여하여, 처음 시작하는 프로젝트 이지만 수월할게 문제없이 잘 마무리 되었다.

이제 각자 맡은 역할에 맞게 개발하러 출발~

 

 

일단, 나는 관리자 정보 관리 부분을 담당하게 되어 요구사항에 맞게 패키지 구성부터 시작하였다.

 

기본적인 엔티티 부분과 레포지토리 부분은 팀장님이 클래스 생성까지만 하였다.

package com.backoffice.admin.entity;

import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@Table(name = "abmins")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Admin extends BaseEntity{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}
package com.backoffice.admin.entity;

import jakarta.persistence.*;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

    @CreatedDate
    @Column(updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime createdAt;

    @LastModifiedDate
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime modifiedAt;
}
package com.backoffice.admin.repository;

import com.backoffice.admin.entity.Admin;
import org.springframework.data.jpa.repository.JpaRepository;

public interface AdminRepository extends JpaRepository<Admin,Long> {
}

 

어려웠던점.

1.백오피스를 개발중인것을 빼고 생각하다가 디티오의 분리를 못하고 코드를 작성하였다.

요구사항을 충족하려 개발을 나아가다 보니, 백오피스의 접근자 (관리자, 일반) 으로 나뉘어 생각 하면 좀더 간결하게 작성이 가능하였다.

[해결]

2.키워드나 정렬순서 정렬기준 등의 기준으로 정렬을 시킬려고 하니 너무 어려웠다.

public AdminListResponseDto getAdminList(AdminListRequestDto requestDto) {
    Pageable pageable = PageRequest.of(
            requestDto.getPage() - 1,
            requestDto.getPageSize(),
            Sort.by(Sort.Direction.fromString(requestDto.getDirection()), requestDto.getSortBy())
    );

    //검색어와 역할/상태 필터를 적용한 조회
    Page<Admin> adminPage = adminRepository.searchAdmins(
            requestDto.getKeyword(), requestDto.getRole(), requestDto.getStatus(), pageable
    );

    List<AdminResponseDto> list = adminPage.getContent().stream()
            .map(AdminResponseDto::new)
            .collect(Collectors.toList());

    return new AdminListResponseDto(
            list, adminPage.getNumber() + 1, adminPage.getTotalPages(),
            adminPage.getTotalElements(), adminPage.getSize(), adminPage.hasNext()
    );
}

[해결] 자료를 찾아보고 해결은 하였으나, 내일 팀원들의 코드를 받아 테스트를 진행보아야 정상 실행이 되는지 확실히 알수있을것같다.