From 06ff06302e25ce58c2b7aa061df64a34562c77b2 Mon Sep 17 00:00:00 2001 From: NaHyun22 Date: Wed, 2 Oct 2024 15:51:53 +0900 Subject: [PATCH] =?UTF-8?q?[=EC=9D=B4=EB=82=98=ED=98=84]1=EC=A3=BC?= =?UTF-8?q?=EC=B0=A8=20=EA=B3=A0=EC=9E=90=E3=85=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 과제 --- .../doit/jpastudy2/repository/Category.java | 28 ++--- .../doit/jpastudy2/repository/Notice.java | 27 +++++ .../repository/NoticeRepository.java | 6 + .../repository/CategoryRepositoryTest.java | 107 +++--------------- .../repository/NoticeRepositoryTest.java | 44 +++++++ 5 files changed, 99 insertions(+), 113 deletions(-) create mode 100644 src/main/java/doit/jpastudy2/repository/Notice.java create mode 100644 src/main/java/doit/jpastudy2/repository/NoticeRepository.java create mode 100644 src/test/java/doit/jpastudy2/repository/NoticeRepositoryTest.java diff --git a/src/main/java/doit/jpastudy2/repository/Category.java b/src/main/java/doit/jpastudy2/repository/Category.java index 4da9720..35ce7f3 100644 --- a/src/main/java/doit/jpastudy2/repository/Category.java +++ b/src/main/java/doit/jpastudy2/repository/Category.java @@ -1,33 +1,23 @@ -package doit.jpastudy2.repository; +package doit.jpastudy_hw.repository; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +@Getter @Entity @NoArgsConstructor -@Getter public class Category { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) - @Id // PK임을 나타낸다. - @GeneratedValue(strategy = GenerationType.AUTO) // 자동 생성되는 값임을 나타낸다. - @Column(name = "category_id") // 컬럼명을 지정한다. + @Column(name = "category_id") private Long id; - // @Column(name = "type")이 생략된 경우 필드명이 컬럼명이 된다. snake_case로 변환된다. - private String type; - - // @Column(name = "description")이 생략된 경우 필드명이 컬럼명이 된다. - private String description; + private String subject; - @Builder // 빌더 패턴을 사용할 수 있게 한다. - public Category(String description, String type) { - this.description = description; - this.type = type; + public Category(String subject) { + this.subject = subject; } } diff --git a/src/main/java/doit/jpastudy2/repository/Notice.java b/src/main/java/doit/jpastudy2/repository/Notice.java new file mode 100644 index 0000000..ad14684 --- /dev/null +++ b/src/main/java/doit/jpastudy2/repository/Notice.java @@ -0,0 +1,27 @@ +package doit.jpastudy_hw.repository; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor +public class Notice { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String writer; + + private String title; + + @ManyToOne + @JoinColumn(name = "category_id") // 외래 키 설정 + private Category category; + + public Notice(String writer, String title, Category category) { + this.writer = writer; + this.title = title; + this.category = category; + } +} diff --git a/src/main/java/doit/jpastudy2/repository/NoticeRepository.java b/src/main/java/doit/jpastudy2/repository/NoticeRepository.java new file mode 100644 index 0000000..b114343 --- /dev/null +++ b/src/main/java/doit/jpastudy2/repository/NoticeRepository.java @@ -0,0 +1,6 @@ +package doit.jpastudy_hw.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface NoticeRepository extends JpaRepository { +} diff --git a/src/test/java/doit/jpastudy2/repository/CategoryRepositoryTest.java b/src/test/java/doit/jpastudy2/repository/CategoryRepositoryTest.java index e271dd6..82883d8 100644 --- a/src/test/java/doit/jpastudy2/repository/CategoryRepositoryTest.java +++ b/src/test/java/doit/jpastudy2/repository/CategoryRepositoryTest.java @@ -1,108 +1,27 @@ -package doit.jpastudy2.repository; +package doit.jpastudy_hw.repository; -import static org.junit.jupiter.api.Assertions.*; - -import java.util.List; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; -@Transactional // 테스트 케이스에 이 어노테이션이 있으면, 테스트가 끝나면 롤백을 해준다. ( 데이터베이스 초기화 ) -@SpringBootTest // 스프링 컨테이너를 이용한 테스트 -class CategoryRepositoryTest { +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; - @Autowired // 스프링이 관리하는 빈을 주입받는다. +@Transactional +@SpringBootTest +class CategoryTest { + @Autowired private CategoryRepository categoryRepository; - @DisplayName("save 테스트") @Test - void test() { - // Given - Category category1 = Category.builder() - .type("양식") - .description("데이트") - .build(); + void test(){ + Category category = new Category("축구"); + categoryRepository.save(category); - Category category2 = Category.builder() - .type("한식") - .description("한국인의 정") - .build(); - - // When - categoryRepository.save(category1); - categoryRepository.save(category2); - - // Then List categories = categoryRepository.findAll(); - Assertions.assertThat(categories).hasSize(2); - Assertions.assertThat(categories.get(0).getType()).isEqualTo("양식"); - Assertions.assertThat(categories.get(0).getDescription()).isEqualTo("데이트"); - } - - @DisplayName("Description을 이용한 조회") - @Test - void findByDescription() { - // Given - Category category1 = Category.builder() - .type("양식") - .description("데이트") - .build(); - - Category category2 = Category.builder() - .type("한식") - .description("한국인의 정") - .build(); - - categoryRepository.save(category1); - categoryRepository.save(category2); - - // When - Category result1 = categoryRepository.findByDescription("철가방"); - Category result2 = categoryRepository.findByDescription("데이트"); - - // Then - Assertions.assertThat(result1).isNull(); - Assertions.assertThat(result2).isNotNull(); - Assertions.assertThat(result2.getType()).isEqualTo("양식"); - } - - @DisplayName("description과 type을 이용한 조회") - @Test - void findByTypeAndDescription() { - // Given - Category category1 = Category.builder() - .type("양식") - .description("데이트") - .build(); - - Category category2 = Category.builder() - .type("한식") - .description("한국인의 정") - .build(); - - Category category3 = Category.builder() - .type("중식") - .description("철가방") - .build(); - - Category category4 = Category.builder() - .type("미식") - .description("축구ㅋㅋ") - .build(); - - categoryRepository.saveAll(List.of(category1, category2, category3, category4)); - - // When - Category result1 = categoryRepository.findByTypeAndDescription("양식", "데이트"); - Category result2 = categoryRepository.findByTypeAndDescription("중식", "데이트"); // null - Category result3 = categoryRepository.findByTypeAndDescription("미식", "축구ㅋㅋ"); - - // Then - Assertions.assertThat(result1.getType()).isEqualTo("양식"); - Assertions.assertThat(result2).isNull(); - Assertions.assertThat(result3.getDescription()).isEqualTo("축구ㅋㅋ"); + System.out.println("categories = " + categories.get(0)); + System.out.println("categories = " + categories.get(0).getSubject()); } } \ No newline at end of file diff --git a/src/test/java/doit/jpastudy2/repository/NoticeRepositoryTest.java b/src/test/java/doit/jpastudy2/repository/NoticeRepositoryTest.java new file mode 100644 index 0000000..11a439e --- /dev/null +++ b/src/test/java/doit/jpastudy2/repository/NoticeRepositoryTest.java @@ -0,0 +1,44 @@ +package doit.jpastudy_hw.repository; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@Transactional +@SpringBootTest +class NoticeTest { + + @Autowired + private NoticeRepository noticeRepository; + + @Autowired + private CategoryRepository categoryRepository; + + @Test + void saveAndRetrieveNotice() { + // 1. 새로운 Category 엔티티 생성 후 저장 + Category category = new Category("Sports"); + categoryRepository.save(category); + + // 2. 새로운 Notice 엔티티 생성 후 저장 + Notice notice = new Notice("John Doe", "Football Match", category); + noticeRepository.save(notice); + + // 3. 저장된 Notice 엔티티 모두 조회 + List notices = noticeRepository.findAll(); + + // 4. Notice 엔티티가 잘 저장되었는지 확인 + assertEquals(1, notices.size()); + assertEquals("John Doe", notices.get(0).getWriter()); + assertEquals("Football Match", notices.get(0).getTitle()); + + // 5. Notice와 연결된 Category 확인 + assertNotNull(notices.get(0).getCategory()); + assertEquals("Sports", notices.get(0).getCategory().getSubject()); + } +}