Skip to content

Commit 315d6f7

Browse files
authored
�feat: community-board 생성 기능 (#17)
* test(community): communityBoard 생성 기능 테스트 작성 - imageUrl 있는 경우 / 없는 경우 나눠서 작성 * feat(community): communityBoard Entity, Repository 추가 * feat(community): communityBoard RequestDto, Usercase 추가 및 Service 구현 * refactor(community): community -> communityBoard 파일 및 변수명 일괄 변경 * test(community): communityBoard 생성 기능 테스트 수정 - command 디렉토리 추가 - IntergrationTestSupport 상속 및 tearDown 추가 * test(community): communityBoard 생성 기능 테스트 수정 * refactor(community): Service 디렉토리 수정 * chore(community): CommunityBoard 엔티티 수정 - imgUrl nullable false 추가 * chore(community): Service 수정 * style(community): CommunityBoard 엔티티 공백 수정
1 parent 32d2584 commit 315d6f7

File tree

7 files changed

+211
-29
lines changed

7 files changed

+211
-29
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.somemore.community.domain;
2+
3+
import com.somemore.global.common.BaseEntity;
4+
import static lombok.AccessLevel.PROTECTED;
5+
6+
import jakarta.persistence.Column;
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.GeneratedValue;
9+
import jakarta.persistence.Id;
10+
import jakarta.persistence.GenerationType;
11+
import jakarta.persistence.Lob;
12+
import jakarta.persistence.Table;
13+
14+
import lombok.Builder;
15+
import lombok.Getter;
16+
import lombok.NoArgsConstructor;
17+
18+
import java.util.UUID;
19+
20+
@Getter
21+
@NoArgsConstructor(access = PROTECTED)
22+
@Entity
23+
@Table(name = "community_board")
24+
public class CommunityBoard extends BaseEntity {
25+
26+
@Id
27+
@GeneratedValue(strategy = GenerationType.IDENTITY)
28+
@Column(name = "id", nullable = false)
29+
private Long id;
30+
31+
@Column(name = "writer_id", nullable = false, length = 16)
32+
private UUID writerId;
33+
34+
@Column(name = "title", nullable = false)
35+
private String title;
36+
37+
@Lob
38+
@Column(name = "content", nullable = false)
39+
private String content;
40+
41+
@Column(name = "img_url", nullable = false)
42+
private String imgUrl;
43+
44+
@Builder
45+
public CommunityBoard(UUID writerId, String title, String content, String imgUrl) {
46+
this.writerId = writerId;
47+
this.title = title;
48+
this.content = content;
49+
this.imgUrl = imgUrl;
50+
}
51+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.somemore.community.dto.request;
2+
3+
import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy;
4+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
5+
import com.somemore.community.domain.CommunityBoard;
6+
import io.swagger.v3.oas.annotations.media.Schema;
7+
import jakarta.validation.constraints.NotBlank;
8+
import lombok.Builder;
9+
10+
import java.util.UUID;
11+
12+
@JsonNaming(SnakeCaseStrategy.class)
13+
@Builder
14+
public record CommunityBoardCreateRequestDto(
15+
@Schema(description = "커뮤니티 게시글 제목", example = "11/29 OO도서관 봉사 같이 갈 사람 모집합니다.")
16+
@NotBlank(message = "게시글 제목은 필수 값입니다.")
17+
String title,
18+
@Schema(description = "커뮤니티 게시글 내용", example = "저 포함 5명이 같이 가면 좋을 거 같아요")
19+
@NotBlank(message = "게시글 내용은 필수 값입니다.")
20+
String content
21+
) {
22+
public CommunityBoard toEntity(UUID writerId, String imgUrl) {
23+
return CommunityBoard.builder()
24+
.writerId(writerId)
25+
.title(title)
26+
.content(content)
27+
.imgUrl(imgUrl)
28+
.build();
29+
}
30+
31+
32+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.somemore.community.repository;
2+
3+
import com.somemore.community.domain.CommunityBoard;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface CommunityBoardRepository extends JpaRepository<CommunityBoard, Long> {
7+
8+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.somemore.community.service.command;
2+
3+
import com.somemore.community.domain.CommunityBoard;
4+
import com.somemore.community.dto.request.CommunityBoardCreateRequestDto;
5+
import com.somemore.community.repository.CommunityBoardRepository;
6+
import com.somemore.community.usecase.command.CreateCommunityBoardUseCase;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.stereotype.Service;
9+
import org.springframework.transaction.annotation.Transactional;
10+
11+
import java.util.UUID;
12+
13+
@RequiredArgsConstructor
14+
@Transactional
15+
@Service
16+
public class CreateCommunityBoardService implements CreateCommunityBoardUseCase {
17+
18+
private final CommunityBoardRepository communityBoardRepository;
19+
20+
@Override
21+
public Long createCommunityBoard(CommunityBoardCreateRequestDto requestDto, UUID writerId, String imgUrl) {
22+
23+
CommunityBoard communityBoard = requestDto.toEntity(writerId, imgUrl == null ? "" : imgUrl);
24+
25+
communityBoardRepository.save(communityBoard);
26+
27+
return communityBoard.getId();
28+
}
29+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.somemore.community.usecase.command;
2+
3+
import com.somemore.community.dto.request.CommunityBoardCreateRequestDto;
4+
5+
import java.util.UUID;
6+
7+
public interface CreateCommunityBoardUseCase {
8+
Long createCommunityBoard(
9+
CommunityBoardCreateRequestDto requestDto,
10+
UUID writerId,
11+
String imgUrl);
12+
}

src/main/java/com/somemore/domains/CommunityBoard.java

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.somemore.community.service.command;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import com.somemore.IntegrationTestSupport;
6+
import com.somemore.community.domain.CommunityBoard;
7+
import com.somemore.community.dto.request.CommunityBoardCreateRequestDto;
8+
import com.somemore.community.repository.CommunityBoardRepository;
9+
import org.junit.jupiter.api.AfterEach;
10+
import org.junit.jupiter.api.DisplayName;
11+
import org.junit.jupiter.api.Test;
12+
import org.springframework.beans.factory.annotation.Autowired;
13+
14+
import java.util.Optional;
15+
import java.util.UUID;
16+
17+
class CreateCommunityBoardServiceTest extends IntegrationTestSupport {
18+
@Autowired
19+
private CreateCommunityBoardService createCommunityBoardService;
20+
@Autowired
21+
private CommunityBoardRepository communityBoardRepository;
22+
23+
@AfterEach
24+
void tearDown() {
25+
communityBoardRepository.deleteAllInBatch();
26+
}
27+
28+
@DisplayName("커뮤니티에 게시글을 등록한다.")
29+
@Test
30+
void createCommunityWithDto() {
31+
//given
32+
CommunityBoardCreateRequestDto dto = CommunityBoardCreateRequestDto.builder()
33+
.title("커뮤니티 테스트 제목")
34+
.content("커뮤니티 테스트 내용")
35+
.build();
36+
37+
UUID writerId = UUID.randomUUID();
38+
String imgUrl = "https://image.test.url/123";
39+
40+
//when
41+
Long communityId = createCommunityBoardService.createCommunityBoard(dto, writerId, imgUrl);
42+
43+
//then
44+
Optional<CommunityBoard> communityBoard = communityBoardRepository.findById(communityId);
45+
46+
assertThat(communityBoard).isPresent();
47+
assertThat(communityBoard.get().getId()).isEqualTo(communityId);
48+
assertThat(communityBoard.get().getWriterId()).isEqualTo(writerId);
49+
assertThat(communityBoard.get().getTitle()).isEqualTo(dto.title());
50+
assertThat(communityBoard.get().getContent()).isEqualTo(dto.content());
51+
assertThat(communityBoard.get().getImgUrl()).isEqualTo(imgUrl);
52+
}
53+
54+
@DisplayName("커뮤니티 게시글을 이미지 링크 없이 등록할 시 빈 문자열을 저장한다.")
55+
@Test
56+
void createCommunityWithoutImgUrl() {
57+
//given
58+
CommunityBoardCreateRequestDto dto = CommunityBoardCreateRequestDto.builder()
59+
.title("커뮤니티 테스트 제목")
60+
.content("커뮤니티 테스트 내용")
61+
.build();
62+
63+
UUID writerId = UUID.randomUUID();
64+
String imgUrl = null;
65+
66+
//when
67+
Long communityId = createCommunityBoardService.createCommunityBoard(dto, writerId, imgUrl);
68+
69+
//then
70+
Optional<CommunityBoard> communityBoard = communityBoardRepository.findById(communityId);
71+
72+
assertThat(communityBoard).isPresent();
73+
assertThat(communityBoard.get().getId()).isEqualTo(communityId);
74+
assertThat(communityBoard.get().getWriterId()).isEqualTo(writerId);
75+
assertThat(communityBoard.get().getTitle()).isEqualTo(dto.title());
76+
assertThat(communityBoard.get().getContent()).isEqualTo(dto.content());
77+
assertThat(communityBoard.get().getImgUrl()).isEmpty();
78+
}
79+
}

0 commit comments

Comments
 (0)