Skip to content

[황민재]Sprint6#204

Open
rorm0819 wants to merge 24 commits intocodeit-bootcamp-spring:황민재from
rorm0819:Sprint6
Open

[황민재]Sprint6#204
rorm0819 wants to merge 24 commits intocodeit-bootcamp-spring:황민재from
rorm0819:Sprint6

Conversation

@rorm0819
Copy link
Copy Markdown
Collaborator

기본 요구사항

데이터베이스

  • 아래와 같이 데이터베이스 환경을 설정하세요.
    • 데이터베이스: discodeit
    • 유저: discodeit_user
    • 패스워드: discodeit1234
  • ERD를 참고하여 DDL을 작성하고, 테이블을 생성하세요.
    • 작성한 DDL 파일은 /src/main/resources/schema.sql 경로에 포함하세요.
      • PK: Primary Key
      • UK: Unique Key
      • NN: Not Null
      • FK: Foreign Key
        • ON DELETE CASCADE: 연관 엔티티 삭제 시 같이 삭제
        • ON DELETE SET NULL: 연관 엔티티 삭제 시 NULL로 변경

Spring Data JPA 적용하기

  • Spring Data JPA와 PostgreSQL을 위한 의존성을 추가하세요.
  • 앞서 구성한 데이터베이스에 연결하기 위한 설정값을 application.yaml 파일에 작성하세요.
  • 디버깅을 위해 SQL 로그와 관련된 설정값을 application.yaml 파일에 작성하세요.

엔티티 정의하기

  • 클래스 다이어그램을 참고해 도메인 모델의 공통 속성을 추상 클래스로 정의하고 상속 관계를 구현하세요.
    • 이때 Serializable 인터페이스는 제외합니다.
    • 패키지명: com.sprint.mission.discodeit.entity.base
  • JPA의 어노테이션을 활용해 createdAt, updatedAt 속성이 자동으로 설정되도록 구현하세요.
    • @CreatedDate, @LastModifiedDate
  • 클래스 다이어그램을 참고해 클래스 참조 관계를 수정하세요. 필요한 경우 생성자, update 메소드를 수정할 수 있습니다. 단, 아직 JPA Entity와 관련된 어노테이션은 작성하지 마세요.
  • ERD와 클래스 다이어그램을 토대로 연관관계 매핑 정보를 표로 정리해보세요.(이 내용은 PR에 첨부해주세요.)
엔티티 관계 다중성 방향성 부모-자식 관계 연관관계의 주인
User : Channel N:1 User → Channel 단방향 부모: Channel, 자식: User User
Message : Channel N:1 Message → Channel 단방향 부모: Channel, 자식: Message Message
Message : User N:1 Message → User 단방향 부모: User, 자식: Message Message
Message : BinaryContent 1:N Message → BinaryContent 양방향 부모: Message, 자식: BinaryContent BinaryContent
User : BinaryContent 1:1 (0..1) User → BinaryContent 단방향 부모: User, 자식: BinaryContent User
User : UserStatus 1:1 User ↔ UserStatus 양방향 부모: User, 자식: UserStatus UserStatus
ReadStatus : User N:1 ReadStatus → User 단방향 부모: User, 자식: ReadStatus ReadStatus
ReadStatus : Channel N:1 ReadStatus → Channel 단방향 부모: Channel, 자식: ReadStatus ReadStatus

레포지토리와 서비스에 JPA 도입하기

  • 기존의 Repository 인터페이스를 JPARepository로 정의하고 쿼리메소드로 대체하세요.
    • FileRepository와 JCFRepository 구현체는 삭제합니다.
  • 영속성 컨텍스트의 특징에 맞추어 서비스 레이어를 수정해보세요.
    • 힌트: 트랜잭션, 영속성 전이, 변경 감지, 지연로딩

DTO 적극 도입하기

  • Entity를 Controller 까지 그대로 노출했을 때 발생할 수 있는 문제점에 대해 정리해보세요. DTO를 적극 도입했을 때 보일러플레이트 코드가 많아지지만, 그럼에도 불구하고 어떤 이점이 있는지 알 수 있을거에요.(이 내용은 PR에 첨부해주세요.)
    • Entitiy를 Controller까지 그대로 노출할 경우 Entitiy와 API의 결합이 강해지게 됨.
    • 프로덕션 환경에서는 성능을 고려해 OSIV를 false로 설정하는 경우가 대부분 -> Lazy Loading 발생시, 프록시 초기화가 안될 수 있음
    • 양방향 연관관계 시 순환 참조 발생 가능
    • 민감한 데이터가(예: 비밀번호) 가 외부로 유출될 수 있음
  • Entity를 DTO로 매핑하는 로직을 책임지는 Mapper 컴포넌트를 정의해 반복되는 코드를 줄여보세요.
    • 패키지명: com.sprint.mission.discodeit.mapper

BinaryContent 저장 로직 고도화

데이터베이스에 이미지와 같은 파일을 저장하면 성능 상 불리한 점이 많습니다. 따라서 실제 바이너리 데이터는 별도의 공간에 저장하고, 데이터베이스에는 바이너리 데이터에 대한 메타 정보(파일명, 크기, 유형 등)만 저장하는 것이 좋습니다.

  • BinaryContent 엔티티는 파일의 메타 정보(fileName, size, contentType)만 표현하도록 bytes 속성을 제거하세요.
  • BinaryContent의 byte[] 데이터 저장을 담당하는 인터페이스를 설계하세요.
    • 패키지명: com.sprint.mission.discodeit.storage

심화

  • 심화 항목 1
  • 심화 항목 2

주요 변경사항

스크린샷

image

멘토에게

  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

jiho0420 and others added 24 commits January 9, 2026 11:11
test: userInfo 수정 로직 테스트 케이스 추가
-서비스 저장소 Map 구조 변경 및 Optional 도입
-테스트 코드 추가
refactor: findById 메서드 반환 타입 변경 (Optional -> Object) 및 예외 처리 로직 내부화
- 채널 참가자 조회(findParticipants) 로직 이관 (ChannelService -> UserService)
- 유저 정보 수정(updateUserInfo) 로직 개선 (if문 -> Optional 체이닝)
- 특정 유저의 참여 채널 목록 조회 기능 구현
@itstimi-XD itstimi-XD self-requested a review March 17, 2026 09:06
Copy link
Copy Markdown
Collaborator

@itstimi-XD itstimi-XD left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전체적인 구조를 잡아주셨어요.
다만 @EnableJpaAuditing, @transactional 같은 핵심 어노테이션과 FK 매핑 방향을 꼭 복습해보세요!

이번에도 미션 진행하시느라 고생 많으셨습니다.

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.

4 participants