Skip to content

Comments

[김현민] sprint 3#108

Open
Gusals911 wants to merge 28 commits intocodeit-bootcamp-spring:김현민from
Gusals911:sprint3
Open

[김현민] sprint 3#108
Gusals911 wants to merge 28 commits intocodeit-bootcamp-spring:김현민from
Gusals911:sprint3

Conversation

@Gusals911
Copy link
Collaborator

@Gusals911 Gusals911 commented Feb 8, 2026

기본 요구사항

Spring 프로젝트 초기화

  • Spring Initializr를 통해 zip 파일을 다운로드하세요.
  • 빌드 시스템은 Gradle - Groovy를 사용합니다.
  • 언어는 Java 17를 사용합니다.
  • Spring Boot의 버전은 3.4.0입니다.
  • GroupId는 com.sprint.mission입니다.
  • ArtifactId와 Name은 discodeit입니다.
  • packaging 형식은 Jar입니다
  • Dependency를 추가합니다.
    • Lombok
    • Spring Web
  • zip 파일을 압축해제하고 원래 진행 중이던 프로젝트에 붙여넣기하세요. 일부 파일은 덮어쓰기할 수 있습니다.
  • application.properties 파일을 yaml 형식으로 변경하세요.
  • DiscodeitApplication의 main 메서드를 실행하고 로그를 확인해보세요.

Bean 선언 및 테스트

  • File*Repository 구현체를 Repository 인터페이스의 Bean으로 등록하세요.
  • Basic*Service 구현체를 Service 인터페이스의 Bean으로 등록하세요.
  • JavaApplication에서 테스트했던 코드를 DiscodeitApplication에서 테스트해보세요.
  • JavaApplication 의 main 메소드를 제외한 모든 메소드를 DiscodeitApplication클래스로 복사하세요.
  • JavaApplication의 main 메소드에서 Service를 초기화하는 코드를 Spring Context를 활용하여 대체하세요.
  • JavaApplication의 main 메소드의 셋업, 테스트 부분의 코드를 DiscodeitApplication클래스로 복사하세요.

Spring 핵심 개념 이해하기

  • JavaApplication과 DiscodeitApplication에서 Service를 초기화하는 방식의 차이에 대해 다음의 키워드를 중심으로 정리해보세요.
    • IoC Container : 객체 생성과 소멸을 개발자가 직접 new로 관리합니다./ 스프링 컨테이너가 객체의 생명주기를 대신 관리합니다.
    • Dependency Injection : 의존 관계를 생성자를 통해 직접 넣어줘야 합니다./ 의존성 주입이 필요한 경우 등록된 클래스를 탐색해 알아서 주입합니다.
    • Bean : 직접 생성된 객체는 단순 인스턴스입니다. / 컨테이너가 생성하고 관리하는 객체입니다.

Lombok 적용


비즈니스 로직 고도화

가 기능 요구사항

시간 타입 변경하기

  • 시간을 다루는 필드의 타입은 Instant로 통일합니다.

새로운 도메인 추가하기

  • 공통: 앞서 정의한 도메인 모델과 동일하게 공통 필드(id, createdAt, updatedAt)를 포함합니다.
  • ReadStatus: 사용자가 채널 별 마지막으로 메시지를 읽은 시간을 표현하는 도메인 모델입니다.
  • UserStatus: 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델입니다.
    • 마지막 접속 시간을 기준으로 현재 로그인한 유저로 판단할 수 있는 메소드를 정의하세요. (5분 이내)
  • BinaryContent: 이미지, 파일 등 바이너리 데이터를 표현하는 도메인 모델입니다.
    • 수정 불가능한 도메인 모델로 간주합니다. 따라서 updatedAt 필드는 정의하지 않습니다.
    • User, Message 도메인 모델과의 의존 관계 방향성을 고려하여 id 참조 필드를 추가하세요.
  • 각 도메인 모델 별 레포지토리 인터페이스를 선언하세요.

UserService 고도화

  • create: 선택적으로 프로필 이미지를 등록하며, DTO를 활용해 파라미터를 그룹화합니다. username과 email 중복을 체크하고 UserStatus를 같이 생성합니다.
  • find, findAll: DTO를 활용하여 사용자의 온라인 상태를 포함하고 패스워드 정보는 제외합니다.
  • update: 선택적으로 프로필 이미지를 대체하며 DTO를 활용합니다.
  • delete: 관련된 도메인(BinaryContent, UserStatus)을 같이 삭제합니다.
  • 의존성: 순환 참조 방지를 위해 다른 Service 대신 Repository 의존성을 주입합니다.

AuthService 구현

  • login: username, password 일치 여부를 확인하고 유저 정보를 반환하거나 예외를 발생시킵니다. DTO를 활용합니다.
  • 의존성: Repository 의존성을 주입합니다.

ChannelService 고도화

  • create: PRIVATE과 PUBLIC 채널 생성 메소드를 분리하고 DTO를 활용합니다. PRIVATE 생성 시 참여 유저별 ReadStatus를 생성합니다.
  • find: DTO를 활용하여 최근 메시지 시간과 PRIVATE 채널 참여 유저 ID를 포함합니다.
  • findAll: findAllByUserId로 변경하여 PUBLIC은 전체, PRIVATE은 참여한 채널만 조회합니다.
  • update: DTO를 활용하며, PRIVATE 채널은 수정할 수 없도록 제한합니다.
  • delete: 관련된 도메인(Message, ReadStatus)을 같이 삭제합니다.
  • 의존성: Repository 의존성을 주입합니다.

MessageService 고도화

  • create: 선택적으로 여러 개의 첨부파일을 등록하며 DTO를 활용합니다.
  • findAll: findallByChannelId로 변경하여 특정 채널의 메시지를 조회합니다.
  • update: DTO를 활용해 파라미터를 그룹화합니다.
  • delete: 관련된 첨부파일(BinaryContent)을 같이 삭제합니다.
  • 의존성: Repository 의존성을 주입합니다.

ReadStatusService 구현

  • create: DTO 활용, 관련 Channel/User 부재 시 예외, 중복 시 예외를 발생시킵니다.
  • find: id로 조회합니다.
  • findAllByUserId: userId를 조건으로 조회합니다.
  • update: DTO를 활용해 파라미터를 그룹화합니다.
  • delete: id로 삭제합니다.
  • 의존성: Repository 의존성을 주입합니다.

UserStatusService 고도화

  • create: DTO 활용, User 부재 시 예외, 중복 시 예외를 발생시킵니다.
  • find: id로 조회합니다.
  • findAll: 모든 객체를 조회합니다.
  • update: DTO를 활용해 파라미터를 그룹화합니다.
  • updateByUserId: userId로 특정 User의 객체를 업데이트합니다.
  • delete: id로 삭제합니다.
  • 의존성: Repository 의존성을 주입합니다.

BinaryContentService 구현

  • create: DTO를 활용해 파라미터를 그룹화합니다.
  • find: id로 조회합니다.
  • findAllByIdIn: id 목록으로 조회합니다.
  • delete: id로 삭제합니다.
  • 의존성: Repository 의존성을 주입합니다.

새로운 도메인 Repository 구현체 구현

  • 지금까지 인터페이스로 설계한 각각의 Repository를 JCF, File로 각각 구현하세요.

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.

1 participant