개발이군고구마

[냄새라도 TDD/OOP] 1. 구현 원칙 확립 본문

SERVER/Architecture

[냄새라도 TDD/OOP] 1. 구현 원칙 확립

김구황 2025. 6. 27. 08:37
728x90
[OOP 설계 프로세스]
1. 설계 원칙 확립 < 구현 1단계
2-1. TDD 구현 단위(도메인) < 구현 2단계
2-2. TDD 구현 단위(컨트롤러-검증) < 구현 2단계
3. TDD 구현 통합
나는 나의 역할만을 담당한다

 

1. 요구사항 분석기 (플로우잡기)

 

Q. 어떤 시스템을 개발해야하나? 

A. 정보 공유 글을 등록하는 기능 

 

Q. 실제 사용자는 누구인가?

A. 관리자 일반 고객

 

Q. 사용자가 할 수 있는 모든 행동들은? 

A. 

관리자 - 정보를 등록하는 대상, 조회 가능 (정보 多)
일반 고객 - 전체 사용자는 정보 목록 조회 가능, 로그인 사용자만 정보 상세 조회 가능 

 

Q. 어떤 속성을 가져야하지? 

A. 타이틀, 컨텐츠, 이미지 url, 전지여부(String)

 

 

Q. 각 단계에서 필요한 검증과 에러처리는? 

A. 

1) 사용자 권한 : 관리자 또는 로그인 사용자에 대한 여부는 SpringSecurity 단에서 처리해주고 있음 

2) 데이터 입력값 검증 : 컨트롤러 단에서 어노테이션으로 처리해주고 있음, 공통으로 ExceptionHandler 만들어서 arguement 에러 처리 

3) 정보 컨텍스트 관련 : 

  • id 값으로 등록된 값을 찾을 수 없을 때 
  • infoCategory enum 값에 등록된 필드가 아닌 다른 값이 들어왔을 때 
  • 미전시 여부에 Y/N을 제외한 알파벳이 들어왔을 때 

 

Q. 각 과정에서 시스템이 가져야 할 책임은? 

A.

Member - 권한 검증, 필터에서 막아줌 

File - 컨텍스트 분리 

 

Q. 결론적으로 로직은 어떻게 설계해야하나? 

A. 아래 의사코드 참조 

 

2. 책임 상세화 (의사코드)

  • 정보 공유 생성 📥 트랜잭션
    1. 정보관련 정보를 입력 페이지로 진입한다.
    2. 이미지 등록 버튼을 클릭하고 파일을 첨부한다. (onChange 이벤트 호출됨)
      1. 먼저 File 이 전달된다.
        1. 각종 유효한 파일인지에 대한 검증을 진행하고 만족하지 않는 경우 예외를 던진다.
        2. filekey 추출작업을 한다.
        3. 파일 정보에 fileKey와 temporary 상태값으로 DB에 저장된다.
          • 저장시에 문제가 생기면 예외를 던진다.
        4. 외부 API와 연결하여 S3 버킷에 저장된다.
        5. imageUrl 추출을 한다. (프론트에서 이미지를 찾기 위함, static.도메인/파일키)
        트랜잭션 종료예외 발생시 : 트랜잭션 롤백 및 사용자 알림 (실패 원인 안내)
      2. 트랜잭션 커밋
      3. 트랜잭션 시작 > 여기서 실패하면 아래 로직 롤백
      4. imageUrl이 반납된다.
    3. 정보공유명(입력) 카테고리(선택), 설명 등록, 전시여부 선택하여 저장버튼을 클릭한다.
      1. imageUrl과 그 외 입력된 정보들이 담겨 다른 정보들과 DB 저장을 진행한다.
        1. 입력된 필드들이 검증에 맞지 않는 경우 예외를 던진다.
          • 정보 공유 명 (길이)
          • 정보 설명 (길이)
          • imageUrl 존재여부 (필수)
        2. 필드 들에 대한 정보가 우선 먼저 DB 에 저장된다.
          • 저장시에 문제가 있는 경우 예외를 던진다. (커스텀 에러 정보 공유 에러)
          • 정보공유코드는 생성규칙에 따라서, 등록자는 시큐리티 정보에 따라서, imageUrl 저장됨
        3. 트랜잭션 시작 > 여기서 실패하면 아래 로직 롤백
        트랜잭션 시작
      2. fileKey를 찾았다면 그에 따른 파일 DB의 상태값을 Permant 로 변경한다.트랜잭션 커밋
      3. 예외 발생시 : 트랜잭션 롤백 및 사용자 알림 (실패 원인 안내)
      4. 트랜잭션 종료

 

 

  • 정보 공유 상세
    1. 정보공유 코드 또는 정보 공유명을 클릭한다.
    2. 등록한 정보공유 상세 정보 페이지에 진입한다.
      1. 받아온 정보공유코드를 기준으로 등록된 정보 공유 상세 정보를 호출한다.
        1. 상세 정보 내역이 없으면 예외를 던진다.
        2. 상세 정보 내역을 담아 응답한다.

 

 

  • 정보 공유 수정 📥 트랜잭션
    1. 정보공유명(입력) 카테고리(선택) 이미지 첨부, 설명 등록, 전시여부 선택하여 수정버튼을 클릭한다.
    2. File을 수정하지 않았다.
      1. 입력된 필드들이 검증에 맞지 않는 경우 예외를 던진다.
      2. 트랜잭션 시작
      3. 필드 정보가 DB 에 저장된다.
        • 저장시에 문제가 있는 경우 예외를 던진다. (커스텀 에러 정보 공유 에러)
        • 등록날짜, 사용자, 정보명, 설명, 전시여부 등 수정가능 한 사항들 업데이트
        트랜잭션 종료예외 발생시 : 트랜잭션 롤백 및 사용자 알림 (실패 원인 안내)
      4. 트랜잭션 커밋
    3. File을 수정하였다.
      1. 먼저 File 이 전달된다.
        1. 각종 유효한 파일인지에 대한 검증을 진행하고 만족하지 않는 경우 예외를 던진다.
        2. filekey 추출작업을 한다.
        3. 파일 정보에 fileKey와 temporary 상태값으로 DB에 저장된다.
          • 저장시에 문제가 생기면 예외를 던진다.
        4. 외부 API와 연결하여 S3 버킷에 저장된다.
        5. imageUrl 추출을 한다. (프론트에서 이미지를 찾기 위함, static.도메인/파일키)
        트랜잭션 종료예외 발생시 : 트랜잭션 롤백 및 사용자 알림 (실패 원인 안내)
      2. 트랜잭션 커밋
      3. 트랜잭션 시작
      4. imageUrl이 반납된다.
      5. 정보공유명(입력) 카테고리(선택), 설명 등록, 전시여부 선택하여 저장버튼을 클릭한다.
        1. imageUrl과 그 외 입력된 정보들이 담겨 다른 정보들과 DB 저장을 진행한다.
          1. 입력된 필드들이 검증에 맞지 않는 경우 예외를 던진다.
            • 정보 공유 명 (길이)
            • 정보 설명 (길이)
            • imageUrl 존재여부 (필수)
          2. 해당 상세 정보에 이미 저장되어있던 imageUrl을 추출한다.
          3. 필드 들에 대한 정보가 우선 먼저 DB 에 저장된다.
            • 저장시에 문제가 있는 경우 예외를 던진다. (커스텀 에러 정보 공유 에러)
            • 정보공유코드는 생성규칙에 따라서, 등록자는 시큐리티 정보에 따라서, imageUrl 저장됨
          4. 트랜잭션 시작 > 여기서 실패하면 아래 로직 롤백
        2. 이미 저장되어있던 imageUrl로 DB 상태 값을 unUseImage 로 변경해준다.
        3. 신규 변경된 imageUrl로 fileKey를 DB의 상태값을 Permant 로 변경한다.트랜잭션 커밋
        4. 예외 발생시 : 트랜잭션 롤백 및 사용자 알림 (실패 원인 안내)
        5. 트랜잭션 종료

 

  • 정보 공유 삭제 📥 트랜잭션
    1. 정보공유코드가 전달된다.
    2. 코드에 따른 정보가 있는지 확인한다.
      1. 정보가 있는 경우 모듈 entity에 값부터 삭제한다.
        1. 모듈 entity의 상태 값을 isDeleted로 변경한다.
      2. 트랜잭션 시작 > 여기서 실패하면 아래 로직 롤백
      3. 모듈 entity에서 가져온 imageUrl로 DB 상태 값을 unUseImage 로 변경해준다.트랜잭션 커밋
      4. 예외 발생시 : 트랜잭션 롤백 및 사용자 알림 (실패 원인 안내)
      5. 트랜잭션 종료

 

3. Event Storming + CRC

정보공유 컨텍스트는 파일 컨테스트와 책임 협력 관계

 

 

4.  클래스 다이어그램을 바탕으로 뼈대 만들기