Skip to content

정구영 sprint2#3

Open
KooYeoung wants to merge 35 commits into
codeit-bootcamp-spring:정구영from
KooYeoung:정구영-sprint2

Hidden character warning

The head ref may contain hidden characters: "\uc815\uad6c\uc601-sprint2"
Open

정구영 sprint2#3
KooYeoung wants to merge 35 commits into
codeit-bootcamp-spring:정구영from
KooYeoung:정구영-sprint2

Conversation

@KooYeoung
Copy link
Copy Markdown
Collaborator

요구사항

기본

도메인 모델링

  • 디스코드 서비스를 활용해보면서 각 도메인 모델에 필요한 정보를 도출하고, Java Class로 구현하세요.
    • 패키지명: com.sprint.mission.discodeit.entity
    • 도메인 모델 정의
      • 공통
        • id: 객체를 식별하기 위한 id로 UUID 타입으로 선언합니다.
        • createdAt, updatedAt: 각각 객체의 생성, 수정 시간을 유닉스 타임스탬프로 나타내기 위한 필드로 Long 타입으로 선언합니다.
      • User
      • Channel
      • Message
    • 생성자
      • id는 생성자에서 초기화하세요.
      • createdAt는 생성자에서 초기화하세요.
      • id, createdAt, updatedAt을 제외한 필드는 생성자의 파라미터를 통해 초기화하세요.
    • 메소드
      • 각 필드를 반환하는 Getter 함수를 정의하세요.
      • 필드를 수정하는 update 함수를 정의하세요.

서비스 설계 및 구현

  • 도메인 모델 별 CRUD(생성, 읽기, 모두 읽기, 수정, 삭제) 기능을 인터페이스로 선언하세요.
    • 인터페이스 패키지명: com.sprint.mission.discodeit.service
    • 인터페이스 네이밍 규칙: [도메인 모델 이름]Service
  • 다음의 조건을 만족하는 서비스 인터페이스의 구현체를 작성하세요.
    • 클래스 패키지명: com.sprint.mission.discodeit.service.jcf
    • 클래스 네이밍 규칙: JCF[인터페이스 이름]
    • Java Collections Framework를 활용하여 데이터를 저장할 수 있는 필드(data)를 final로 선언하고 생성자에서 초기화하세요.
    • data 필드를 활용해 생성, 조회, 수정, 삭제하는 메소드를 구현하세요.

메인 클래스 구현

  • 메인 메소드가 선언된 JavaApplication 클래스를 선언하고, 도메인 별 서비스 구현체를 테스트해보세요.
    • 등록
    • 조회(단건, 다건)
    • 수정
    • 수정된 데이터 조회
    • 삭제
    • 조회를 통해 삭제되었는지 확인

요구사항 2

기본 요구사항

File IO를 통한 데이터 영속화

  • 다음의 조건을 만족하는 서비스 인터페이스의 구현체를 작성하세요.

    • 클래스 패키지명: com.sprint.mission.discodeit.service.file

    • 클래스 네이밍 규칙: File[인터페이스 이름]

    • JCF 대신 FileIO와 객체 직렬화를 활용해 메소드를 구현하세요.

  • Application에서 서비스 구현체를 File*Service로 바꾸어 테스트해보세요.

서비스 구현체 분석

  • JCFService 구현체와 FileService 구현체를 비교하여 공통점과 차이점을 발견해보세요.
    • "비즈니스 로직"과 관련된 코드를 식별해보세요.
    • "저장 로직"과 관련된 코드를 식별해보세요.

레포지토리 설계 및 구현

  • "저장 로직"과 관련된 기능을 도메인 모델 별 인터페이스로 선언하세요.
    • 인터페이스 패키지명: com.sprint.mission.discodeit.repository
    • 인터페이스 네이밍 규칙: [도메인 모델 이름]Repository
  • 다음의 조건을 만족하는 레포지토리 인터페이스의 구현체를 작성하세요.
    • 클래스 패키지명: com.sprint.mission.discodeit.repository.jcf
    • 클래스 네이밍 규칙: JCF[인터페이스 이름]
    • 기존에 구현한 JCF*Service 구현체의 "저장 로직"과 관련된 코드를 참고하여 구현하세요.
  • 다음의 조건을 만족하는 레포지토리 인터페이스의 구현체를 작성하세요.
    • 클래스 패키지명: com.sprint.mission.discodeit.repository.file
    • 클래스 네이밍 규칙: File[인터페이스 이름]
    • 기존에 구현한 File*Service 구현체의 "저장 로직"과 관련된 코드를 참고하여 구현하세요.

심화

서비스 간 의존성 주입

  • 도메인 모델 간 관계를 고려해서 검증하는 로직을 추가하고, 테스트해보세요.
    • 힌트: Message를 생성할 때 연관된 도메인 모델 데이터 확인하기

관심사 분리를 통한 레이어 간 의존성 주입

  • 다음의 조건을 만족하는 서비스 인터페이스의 구현체를 작성하세요.

    • 클래스 패키지명: com.sprint.mission.discodeit.service.basic
    • 클래스 네이밍 규칙: Basic[인터페이스 이름]
    • 기존에 구현한 서비스 구현체의 "비즈니스 로직"과 관련된 코드를 참고하여 구현하세요.
    • 필요한 Repository 인터페이스를 필드로 선언하고 생성자를 통해 초기화하세요.
    • "저장 로직"은 Repository 인터페이스 필드를 활용하세요. (직접 구현하지 마세요.)
  • Basic*Service 구현체를 활용하여 테스트해보세요.

    • 코드 템플릿

      public class JavaApplication {
         static User setupUser(UserService userService) {
            User user = userService.create("woody", "woody@codeit.com", "woody1234");
            return user;
         }
      
         static Channel setupChannel(ChannelService channelService) {
            Channel channel = channelService.create(ChannelType.PUBLIC, "공지", "공지 채널입니다.");
            return channel;
         }
      
         static void messageCreateTest(MessageService messageService, Channel channel, User author) {
            Message message = messageService.create("안녕하세요.", channel.getId(), author.getId());
            System.out.println("메시지 생성: " + message.getId());
         }
      
         public static void main(String[] args) {
            // 서비스 초기화
            // TODO Basic*Service 구현체를 초기화하세요.
            UserService userService;
            ChannelService channelService;
            MessageService messageService;
      
            // 셋업
            User user = setupUser(userService);
            Channel channel = setupChannel(channelService);
            // 테스트
            messageCreateTest(messageService, channel, user);
         }
      }
    • JCF*Repository 구현체를 활용하여 테스트해보세요.

    • [X File*Repository 구현체를 활용하여 테스트해보세요.

  • [] 이전에 작성했던 코드(JCFService 또는 FileService)와 비교해 어떤 차이가 있는지 정리해보세요.

주요 변경사항

스크린샷

  • image

멘토에게

rndud008 added 30 commits May 1, 2026 16:54
메시지 파일 저장 시 User, Channel 전체 객체가 저장되지 않도록 제외하고, userId와 channelId만 포함되도록 수정
rndud008 added 5 commits May 13, 2026 21:08
메시지 파일 저장 시 User, Channel 전체 객체가 저장되지 않도록 제외하고, userId와 channelId만 포함되도록 수정
Windows 환경에서 Java 컴파일 시 기본 인코딩 차이로 인한 빌드 문제를 방지하기 위해 UTF-8 인코딩을 명시한다.
BaseEntity의 uuid와 createdAt이 변경되지 않도록 명시하고, User 출력 시 비밀번호가 노출되지 않도록 마스킹 처리한다.
@KooYeoung KooYeoung requested a review from the-eris-net May 15, 2026 23:35
@KooYeoung KooYeoung added bug Something isn't working and removed bug Something isn't working labels May 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants