[CRM 개발일지 #6] 상담 신청 기능 구현 (고객 생성, ActivityLog 자동 저장)

2026. 5. 12. 20:01·SpringBoot
728x90

🚀 TODAY WORK

백엔드

  • 상담 신청 API(POST /consult/apply) 구현
  • 상담 신청 요청 DTO(ConsultApplyRequestDto) 생성
  • CustomerService 상담 신청 비즈니스 로직 구현
  • 전화번호 + 생년월일 기준 기존 고객 조회 로직 구현
  • 신규 고객(Customer) 자동 생성 로직 구현
  • 상담 신청 시 ActivityLog 자동 생성 기능 구현
  • ActivityLog RECEIVED 상태 저장 처리
  • 상담 신청 API 테스트 및 DB 저장 확인

프론트엔드

  • 상담 신청 페이지(/consult/apply) 생성
  • 상담 전용 Layout 구성 및 공통코드(CodeInitializer) 적용
  • 상담 신청 API 연동
  • 상담 신청 Form 상태 관리 구현
  • 입력값 유효성 검증 추가
  • 공통코드(Store) 기반 관심 과정 Select 구현
  • 공통코드(Store) 기반 유입 경로 Radio 구현
  • 상담 신청 페이지 UI 및 CSS Module 구성
  • 상담 신청 성공/실패 메시지 처리
  • 상담 신청 기능 통합 테스트 완료

🚨 TODAY ISSUE

상담 신청 프로세스 구현

고객이 상담 신청을 하면 기존 고객인지 확인한 뒤,

신규 고객 생성 및 상담 이력을 자동으로 생성하는 구조가 필요했다.

 

기존 구조

상담 신청
→ Customer 저장

변경 구조

상담 신청
        ↓
전화번호 + 생년월일 기준 고객 조회
        ↓
기존 고객이면 재사용
신규 고객이면 Customer 생성
        ↓
ActivityLog 자동 생성(RECEIVED)

1-1) Controller - 상담 신청 API

상담 신청 요청을 받아 CustomerService로 전달하도록 구현했다.

@PostMapping("/apply")
public ResponseEntity<Void> apply(
        @RequestBody ConsultApplyRequestDto request
) {

    customerService.applyConsult(request);

    return ResponseEntity.ok().build();
}

1-2) Service - 기존 고객 조회 및 신규 고객 생성

전화번호와 생년월일을 기준으로 기존 고객을 조회하고,

없으면 신규 고객을 생성하도록 구현했다.

Customer customer =
        customerRepository
                .findByPhoneAndBirthDate(
                        request.getPhone(),
                        request.getBirthDate()
                )
                .orElseGet(() -> {

                    Customer newCustomer = Customer.builder()
                            .name(request.getName())
                            .phone(request.getPhone())
                            .birthDate(request.getBirthDate())
                            .email(request.getEmail())
                            .interestCourse(request.getInterestCourse())
                            .leadSource(request.getLeadSource())
                            .status("NEW")
                            .build();

                    return customerRepository.save(newCustomer);
                });

1-3) ActivityLog 자동 생성

상담 신청 완료 후 ActivityLog를 자동 생성하여

최초 상담 접수 이력을 남기도록 구현했다.

ActivityLog activityLog = ActivityLog.builder()
        .customer(customer)
        .createdBy("SYSTEM")
        .activityResult("RECEIVED")
        .content(content)
        .build();

activityLogRepository.save(activityLog);

공통코드(Store) 기반 화면 구성

상담 신청 페이지에서도 관리자/상담사 화면과 동일한 방식으로

공통코드를 활용하도록 구성했다.

 

초기에는 Input으로 구현했지만,

설계에 맞게 Select와 Radio를 공통코드 기반으로 변경했다.

const { codes, hydrated } = useCodeStore();

{codes.INTEREST_COURSE?.map((course) => (
    <option
        key={course.code}
        value={course.code}
    >
        {course.name}
    </option>
))}

유입 경로 역시 동일하게 공통코드를 사용하도록 변경했다.

{codes.LEAD_SOURCE?.map((source) => (
    <label key={source.code}>
        <input
            type="radio"
            name="leadSource"
            value={source.code}
            checked={form.leadSource === source.code}
            onChange={handleChange}
        />

        {source.name}
    </label>
))}

Spring Security 접근 권한

상담 신청은 비회원도 사용할 수 있는 기능이므로

Spring Security에서 /consult/** 경로를 허용하도록 수정하여 403 Forbidden 오류를 해결했다.


✨ TODAY RESULT

상담 신청 API

  • 기존 고객 조회
  • 신규 고객 자동 생성
  • ActivityLog 자동 생성
  • 상담 신청 정상 처리
customerService.applyConsult(request);

Customer 저장

  • 이름
  • 생년월일
  • 연락처
  • 이메일
  • 관심 과정
  • 유입 경로
  • 상태(NEW)

정상 저장 확인.


ActivityLog 저장

  • createdBy = SYSTEM (기본값)
  • activityResult = RECEIVED (상담 대기)
  • 초기 상담 내용(Content) 저장

자동 생성 확인


상담 신청 페이지

  • 기본 정보 영역
  • 상담 정보 영역
  • 유입 경로 영역
  • 공통코드 Select
  • 공통코드 Radio
  • 입력값 검증
  • 성공/실패 메시지

구현 완료.


🔥 NEXT TODO

  • 상담 신청 완료 페이지(/consult/complete) 구현
  • 상담 신청 완료 후 페이지 이동 처리
  • DTO Validation(@Valid, @NotBlank 등) 적용
  • 상담 희망 시간 저장 여부 검토
  • 상담 신청 UI 개선
  • 공통 Form 컴포넌트 리팩토링 검토
  • 공통 Select / Radio 컴포넌트 분리 검토
728x90

'SpringBoot' 카테고리의 다른 글

[CRM 개발일지 #7] 상담 신청 기능 구현 (완료 페이지, 공통코드 연동, Validation)  (0) 2026.05.13
[CRM 개발일지 #5] 상담 신청 기능 구조 설계  (0) 2026.05.11
[CRM 개발일지 #4] 상담사 고객 관리와 관리자 대시보드 UI 구축  (0) 2026.05.10
[CRM 개발일지 #3] 관리자 고객 관리 API 연동 작업  (0) 2026.05.08
[CRM 개발일지 #2] 공통 코드 상태 관리 구조 개선 + Zustand 적용  (0) 2026.05.07
'SpringBoot' 카테고리의 다른 글
  • [CRM 개발일지 #7] 상담 신청 기능 구현 (완료 페이지, 공통코드 연동, Validation)
  • [CRM 개발일지 #5] 상담 신청 기능 구조 설계
  • [CRM 개발일지 #4] 상담사 고객 관리와 관리자 대시보드 UI 구축
  • [CRM 개발일지 #3] 관리자 고객 관리 API 연동 작업
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN
      • 코테(Solved.ac + Programmers)
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    배열
    문자열
    자바
    dp
    피보나치
    백준
    기출문제
    정보처리기사 실기 기출문제
    알고리즘
    실기
    코딩테스트
    정처기실기
    정처기
    시뮬레이션
    브루트포스
    정렬
    springboot
    정보처리기사
    level1
    solved.ac
    백엔드개발자
    수학
    정처기오답노트
    level0
    java
    완전탐색
    프로그래머스
    자료구조
    구현
    Level2
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
[CRM 개발일지 #6] 상담 신청 기능 구현 (고객 생성, ActivityLog 자동 저장)
상단으로

티스토리툴바