Skip to content

Commit 3770f59

Browse files
authored
Merge pull request #107 from martinP-Ghub/part1-박태식-sprint2
[박태식] sprint2
2 parents ecfe99e + 5ee0368 commit 3770f59

32 files changed

+1444
-478
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ fabric.properties
142142
.gradle
143143
**/build/
144144
!src/**/build/
145-
145+
gradlew
146146
# Ignore Gradle GUI config
147147
gradle-app.setting
148148

README.md

+67-58
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,108 @@
11
# Spring 백엔드 트랙 1기 스프린트 미션 제출 리포지토리
22

3-
## 요구사항
3+
## sprint mission 2
44

5-
### 기본 요구사항
5+
## 요구사항
6+
## 기본 요구사항
7+
### File IO를 통한 데이터 영속화
68

7-
### 프로젝트 초기화
9+
[ ] 다음의 조건을 만족하는 서비스 인터페이스의 구현체를 작성하세요.
810

9-
[ ] IntelliJ를 통해 다음의 조건으로 Java 프로젝트를 생성합니다.
11+
[ ] 클래스 패키지명: com.sprint.mission.discodeit.service.file
1012

11-
[ ] IntelliJ에서 제공하는 프로젝트 템플릿 중 Java를 선택합니다.
13+
[ ] 클래스 네이밍 규칙: File[인터페이스 이름]
1214

13-
[ ] 프로젝트의 경로는 스프린트 미션 리포지토리의 경로와 같게 설정합니다.
15+
[ ] JCF 대신 FileIO와 객체 직렬화를 활용해 메소드를 구현하세요.
1416

15-
[ ] Create Git Repository 옵션은 체크하지 않습니다.
17+
### 객체 직렬화/역직렬화 가이드
1618

17-
[ ] Build system은 Gradle을 사용합니다. Gradle DSL은 Groovy를 사용합니다.
19+
[ ] Application에서 서비스 구현체를 File*Service로 바꾸어 테스트해보세요.
1820

19-
[ ] JDK 17을 선택합니다.
21+
### 서비스 구현체 분석
2022

21-
[ ] GroupId는 com.sprint.mission로 설정합니다.
23+
[ ] JCF*Service 구현체와 File*Service 구현체를 비교하여 공통점과 차이점을 발견해보세요.
2224

23-
[ ] ArtifactId는 수정하지 않습니다.
25+
[ ] "비즈니스 로직"과 관련된 코드를 식별해보세요.
2426

25-
[ ] .gitignore에 IntelliJ와 관련된 파일이 형상관리 되지 않도록 .idea디렉토리를 추가합니다.
27+
[ ] "저장 로직"과 관련된 코드를 식별해보세요.
2628

27-
### 도메인 모델링
29+
### 레포지토리 설계 및 구현
2830

29-
[ ] 디스코드 서비스를 활용해보면서 각 도메인 모델에 필요한 정보를 도출하고, Java Class로 구현하세요.
31+
[ ] "저장 로직"과 관련된 기능을 도메인 모델 별 인터페이스로 선언하세요.
3032

31-
[ ] 패키지명: com.sprint.mission.discodeit.entity
33+
[ ] 인터페이스 패키지명: com.sprint.mission.discodeit.repository
3234

33-
[ ] 도메인 모델 정의
35+
[ ] 인터페이스 네이밍 규칙: [도메인 모델 이름]Repository
3436

35-
1. 공통
36-
37-
[ ] id: 객체를 식별하기 위한 id로 UUID 타입으로 선언합니다.
38-
39-
[ ] createdAt, updatedAt: 각각 객체의 생성, 수정 시간을 유닉스 타임스탬프로 나타내기 위한 필드로 Long 타입으로 선언합니다.
40-
2. User
41-
3. Channel
42-
4. Message
43-
5. 생성자
44-
[ ] id는 생성자에서 초기화하세요.
45-
46-
[ ] createdAt는 생성자에서 초기화하세요.
37+
[ ] 다음의 조건을 만족하는 레포지토리 인터페이스의 구현체를 작성하세요.
4738

48-
[ ] id, createdAt, updatedAt을 제외한 필드는 생성자의 파라미터를 통해 초기화하세요.
49-
50-
6. 메소드
51-
52-
[ ] 각 필드를 반환하는 Getter 함수를 정의하세요.
39+
[ ] 클래스 패키지명: com.sprint.mission.discodeit.repository.jcf
5340

54-
[ ] 필드를 수정하는 update 함수를 정의하세요.
55-
56-
### 서비스 설계 및 구현
41+
[ ] 클래스 네이밍 규칙: JCF[인터페이스 이름]
5742

58-
[ ] 도메인 모델 별 CRUD(생성, 읽기, 모두 읽기, 수정, 삭제) 기능을 인터페이스로 선언하세요.
43+
[ ] 기존에 구현한 JCF*Service 구현체의 "저장 로직"과 관련된 코드를 참고하여 구현하세요.
5944

60-
[ ] 인터페이스 패키지명: com.sprint.mission.discodeit.service
45+
[ ] 다음의 조건을 만족하는 레포지토리 인터페이스의 구현체를 작성하세요.
6146

62-
[ ] 인터페이스 네이밍 규칙: [도메인 모델 이름]Service
47+
[ ] 클래스 패키지명: com.sprint.mission.discodeit.repository.file
6348

64-
[ ] 다음의 조건을 만족하는 서비스 인터페이스의 구현체를 작성하세요.
49+
[ ] 클래스 네이밍 규칙: File[인터페이스 이름]
6550

66-
[ ] 클래스 패키지명: com.sprint.mission.discodeit.service.jcf
51+
[ ] 기존에 구현한 File*Service 구현체의 "저장 로직"과 관련된 코드를 참고하여 구현하세요.
6752

68-
[ ] 클래스 네이밍 규칙: JCF[인터페이스 이름]
53+
### 심화 요구 사항
6954

70-
[ ] Java Collections Framework를 활용하여 데이터를 저장할 수 있는 필드(data)를 final로 선언하고 생성자에서 초기화하세요.
55+
관심사 분리를 통한 레이어 간 의존성 주입
7156

72-
[ ] data 필드를 활용해 생성, 조회, 수정, 삭제하는 메소드를 구현하세요.
57+
[ ] 다음의 조건을 만족하는 서비스 인터페이스의 구현체를 작성하세요.
7358

74-
### 메인 클래스 구현
59+
[ ] 클래스 패키지명: com.sprint.mission.discodeit.service.basic
7560

76-
[ ] 메인 메소드가 선언된 JavaApplication 클래스를 선언하고, 도메인 별 서비스 구현체를 테스트해보세요.
61+
[ ] 클래스 네이밍 규칙: Basic[인터페이스 이름]
7762

78-
[ ] 등록
63+
[ ] 기존에 구현한 서비스 구현체의 "비즈니스 로직"과 관련된 코드를 참고하여 구현하세요.
7964

80-
[ ] 조회(단건, 다건)
65+
[ ] 필요한 Repository 인터페이스를 필드로 선언하고 생성자를 통해 초기화하세요.
8166

82-
[ ] 수정
67+
[ ] "저장 로직"은 Repository 인터페이스 필드를 활용하세요. (직접 구현하지 마세요.)
8368

84-
[ ] 수정된 데이터 조회
69+
[ ] Basic*Service 구현체를 활용하여 테스트해보세요.
8570

86-
[ ] 삭제
71+
### 코드 템플릿
72+
```
73+
public class JavaApplication {
74+
static User setupUser(UserService userService) {
75+
User user = userService.create("woody", "[email protected]", "woody1234");
76+
return user;
77+
}
8778
88-
[ ] 조회를 통해 삭제되었는지 확인
79+
static Channel setupChannel(ChannelService channelService) {
80+
Channel channel = channelService.create(ChannelType.PUBLIC, "공지", "공지 채널입니다.");
81+
return channel;
82+
}
8983
90-
## 기본 요구사항 커밋 태그
84+
static void messageCreateTest(MessageService messageService, Channel channel, User author) {
85+
Message message = messageService.create("안녕하세요.", channel.getId(), author.getId());
86+
System.out.println("메시지 생성: " + message.getId());
87+
}
9188
92-
[ ] 여기까지 진행 후 반드시 커밋해주세요. 그리고 sprint1-basic 태그를 생성해주세요.
89+
public static void main(String[] args) {
90+
// 서비스 초기화
91+
// TODO Basic*Service 구현체를 초기화하세요.
92+
UserService userService;
93+
ChannelService channelService;
94+
MessageService messageService;
9395
94-
## 심화 요구 사항
96+
// 셋업
97+
User user = setupUser(userService);
98+
Channel channel = setupChannel(channelService);
99+
// 테스트
100+
messageCreateTest(messageService, channel, user);
101+
}
102+
}
103+
```
104+
[ ] JCF*Repository 구현체를 활용하여 테스트해보세요.
95105

96-
서비스 간 의존성 주입
106+
[ ] File*Repository 구현체를 활용하여 테스트해보세요.
97107

98-
[ ] 도메인 모델 간 관계를 고려해서 검증하는 로직을 추가하고, 테스트해보세요.
99-
힌트: Message를 생성할 때 연관된 도메인 모델 데이터 확인하기
108+
[ ] 이전에 작성했던 코드(JCF*Service 또는 File*Service)와 비교해 어떤 차이가 있는지 정리해보세요.

config/channel.ser

44.3 KB
Binary file not shown.

config/message.ser

6.51 KB
Binary file not shown.

config/user.ser

19.8 KB
Binary file not shown.

0 commit comments

Comments
 (0)