|
1 | 1 | # Spring 백엔드 트랙 1기 스프린트 미션 제출 리포지토리
|
2 | 2 |
|
3 |
| -## 요구사항 |
| 3 | +## sprint mission 2 |
4 | 4 |
|
5 |
| -### 기본 요구사항 |
| 5 | +## 요구사항 |
| 6 | +## 기본 요구사항 |
| 7 | +### File IO를 통한 데이터 영속화 |
6 | 8 |
|
7 |
| -### 프로젝트 초기화 |
| 9 | +[ ] 다음의 조건을 만족하는 서비스 인터페이스의 구현체를 작성하세요. |
8 | 10 |
|
9 |
| -[ ] IntelliJ를 통해 다음의 조건으로 Java 프로젝트를 생성합니다. |
| 11 | +[ ] 클래스 패키지명: com.sprint.mission.discodeit.service.file |
10 | 12 |
|
11 |
| -[ ] IntelliJ에서 제공하는 프로젝트 템플릿 중 Java를 선택합니다. |
| 13 | +[ ] 클래스 네이밍 규칙: File[인터페이스 이름] |
12 | 14 |
|
13 |
| -[ ] 프로젝트의 경로는 스프린트 미션 리포지토리의 경로와 같게 설정합니다. |
| 15 | +[ ] JCF 대신 FileIO와 객체 직렬화를 활용해 메소드를 구현하세요. |
14 | 16 |
|
15 |
| -[ ] Create Git Repository 옵션은 체크하지 않습니다. |
| 17 | +### 객체 직렬화/역직렬화 가이드 |
16 | 18 |
|
17 |
| -[ ] Build system은 Gradle을 사용합니다. Gradle DSL은 Groovy를 사용합니다. |
| 19 | +[ ] Application에서 서비스 구현체를 File*Service로 바꾸어 테스트해보세요. |
18 | 20 |
|
19 |
| -[ ] JDK 17을 선택합니다. |
| 21 | +### 서비스 구현체 분석 |
20 | 22 |
|
21 |
| -[ ] GroupId는 com.sprint.mission로 설정합니다. |
| 23 | +[ ] JCF*Service 구현체와 File*Service 구현체를 비교하여 공통점과 차이점을 발견해보세요. |
22 | 24 |
|
23 |
| -[ ] ArtifactId는 수정하지 않습니다. |
| 25 | +[ ] "비즈니스 로직"과 관련된 코드를 식별해보세요. |
24 | 26 |
|
25 |
| -[ ] .gitignore에 IntelliJ와 관련된 파일이 형상관리 되지 않도록 .idea디렉토리를 추가합니다. |
| 27 | +[ ] "저장 로직"과 관련된 코드를 식별해보세요. |
26 | 28 |
|
27 |
| -### 도메인 모델링 |
| 29 | +### 레포지토리 설계 및 구현 |
28 | 30 |
|
29 |
| -[ ] 디스코드 서비스를 활용해보면서 각 도메인 모델에 필요한 정보를 도출하고, Java Class로 구현하세요. |
| 31 | +[ ] "저장 로직"과 관련된 기능을 도메인 모델 별 인터페이스로 선언하세요. |
30 | 32 |
|
31 |
| -[ ] 패키지명: com.sprint.mission.discodeit.entity |
| 33 | +[ ] 인터페이스 패키지명: com.sprint.mission.discodeit.repository |
32 | 34 |
|
33 |
| -[ ] 도메인 모델 정의 |
| 35 | +[ ] 인터페이스 네이밍 규칙: [도메인 모델 이름]Repository |
34 | 36 |
|
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 | +[ ] 다음의 조건을 만족하는 레포지토리 인터페이스의 구현체를 작성하세요. |
47 | 38 |
|
48 |
| - [ ] id, createdAt, updatedAt을 제외한 필드는 생성자의 파라미터를 통해 초기화하세요. |
49 |
| - |
50 |
| -6. 메소드 |
51 |
| - |
52 |
| - [ ] 각 필드를 반환하는 Getter 함수를 정의하세요. |
| 39 | +[ ] 클래스 패키지명: com.sprint.mission.discodeit.repository.jcf |
53 | 40 |
|
54 |
| - [ ] 필드를 수정하는 update 함수를 정의하세요. |
55 |
| - |
56 |
| -### 서비스 설계 및 구현 |
| 41 | +[ ] 클래스 네이밍 규칙: JCF[인터페이스 이름] |
57 | 42 |
|
58 |
| -[ ] 도메인 모델 별 CRUD(생성, 읽기, 모두 읽기, 수정, 삭제) 기능을 인터페이스로 선언하세요. |
| 43 | +[ ] 기존에 구현한 JCF*Service 구현체의 "저장 로직"과 관련된 코드를 참고하여 구현하세요. |
59 | 44 |
|
60 |
| -[ ] 인터페이스 패키지명: com.sprint.mission.discodeit.service |
| 45 | +[ ] 다음의 조건을 만족하는 레포지토리 인터페이스의 구현체를 작성하세요. |
61 | 46 |
|
62 |
| -[ ] 인터페이스 네이밍 규칙: [도메인 모델 이름]Service |
| 47 | +[ ] 클래스 패키지명: com.sprint.mission.discodeit.repository.file |
63 | 48 |
|
64 |
| -[ ] 다음의 조건을 만족하는 서비스 인터페이스의 구현체를 작성하세요. |
| 49 | +[ ] 클래스 네이밍 규칙: File[인터페이스 이름] |
65 | 50 |
|
66 |
| -[ ] 클래스 패키지명: com.sprint.mission.discodeit.service.jcf |
| 51 | +[ ] 기존에 구현한 File*Service 구현체의 "저장 로직"과 관련된 코드를 참고하여 구현하세요. |
67 | 52 |
|
68 |
| -[ ] 클래스 네이밍 규칙: JCF[인터페이스 이름] |
| 53 | +### 심화 요구 사항 |
69 | 54 |
|
70 |
| -[ ] Java Collections Framework를 활용하여 데이터를 저장할 수 있는 필드(data)를 final로 선언하고 생성자에서 초기화하세요. |
| 55 | +관심사 분리를 통한 레이어 간 의존성 주입 |
71 | 56 |
|
72 |
| -[ ] data 필드를 활용해 생성, 조회, 수정, 삭제하는 메소드를 구현하세요. |
| 57 | +[ ] 다음의 조건을 만족하는 서비스 인터페이스의 구현체를 작성하세요. |
73 | 58 |
|
74 |
| -### 메인 클래스 구현 |
| 59 | +[ ] 클래스 패키지명: com.sprint.mission.discodeit.service.basic |
75 | 60 |
|
76 |
| -[ ] 메인 메소드가 선언된 JavaApplication 클래스를 선언하고, 도메인 별 서비스 구현체를 테스트해보세요. |
| 61 | +[ ] 클래스 네이밍 규칙: Basic[인터페이스 이름] |
77 | 62 |
|
78 |
| -[ ] 등록 |
| 63 | +[ ] 기존에 구현한 서비스 구현체의 "비즈니스 로직"과 관련된 코드를 참고하여 구현하세요. |
79 | 64 |
|
80 |
| -[ ] 조회(단건, 다건) |
| 65 | +[ ] 필요한 Repository 인터페이스를 필드로 선언하고 생성자를 통해 초기화하세요. |
81 | 66 |
|
82 |
| -[ ] 수정 |
| 67 | +[ ] "저장 로직"은 Repository 인터페이스 필드를 활용하세요. (직접 구현하지 마세요.) |
83 | 68 |
|
84 |
| -[ ] 수정된 데이터 조회 |
| 69 | +[ ] Basic*Service 구현체를 활용하여 테스트해보세요. |
85 | 70 |
|
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 | + } |
87 | 78 |
|
88 |
| -[ ] 조회를 통해 삭제되었는지 확인 |
| 79 | + static Channel setupChannel(ChannelService channelService) { |
| 80 | + Channel channel = channelService.create(ChannelType.PUBLIC, "공지", "공지 채널입니다."); |
| 81 | + return channel; |
| 82 | + } |
89 | 83 |
|
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 | + } |
91 | 88 |
|
92 |
| -[ ] 여기까지 진행 후 반드시 커밋해주세요. 그리고 sprint1-basic 태그를 생성해주세요. |
| 89 | + public static void main(String[] args) { |
| 90 | + // 서비스 초기화 |
| 91 | + // TODO Basic*Service 구현체를 초기화하세요. |
| 92 | + UserService userService; |
| 93 | + ChannelService channelService; |
| 94 | + MessageService messageService; |
93 | 95 |
|
94 |
| -## 심화 요구 사항 |
| 96 | + // 셋업 |
| 97 | + User user = setupUser(userService); |
| 98 | + Channel channel = setupChannel(channelService); |
| 99 | + // 테스트 |
| 100 | + messageCreateTest(messageService, channel, user); |
| 101 | + } |
| 102 | +} |
| 103 | +``` |
| 104 | +[ ] JCF*Repository 구현체를 활용하여 테스트해보세요. |
95 | 105 |
|
96 |
| -서비스 간 의존성 주입 |
| 106 | +[ ] File*Repository 구현체를 활용하여 테스트해보세요. |
97 | 107 |
|
98 |
| -[ ] 도메인 모델 간 관계를 고려해서 검증하는 로직을 추가하고, 테스트해보세요. |
99 |
| -힌트: Message를 생성할 때 연관된 도메인 모델 데이터 확인하기 |
| 108 | +[ ] 이전에 작성했던 코드(JCF*Service 또는 File*Service)와 비교해 어떤 차이가 있는지 정리해보세요. |
0 commit comments