-
1. 블로그 프로젝트프로그래밍 2022. 7. 2. 17:45반응형
프로젝트를 생성하고 게시물을 등록하는 곳까지 구현하였다. 백엔드에는 Spring Boot, JPA, H2database를 사용하고, 프론트엔드에는 HTML, CSS, JavaScript 를 사용했다. 또한 데이터를 페이지에 렌더링하기 위해 서버 사이드 렌더링 방식을 채택하였고, 이를 위해 Thymeleaf를 사용하였다.
controller
- PostApiController
- MainController
domain
- Post
- PostRepository
service
- PostService
domain
@NoArgsConstructor @Getter @Entity public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "POST_ID") private Long id; @Column(name = "TITLE") private String title; @Column(name = "CONTENT") private String content; public Post(String title, String content) { this.title = title; this.content = content; } }
게시물 엔티티인 Post의 코드이다. 엔티티는 항상 기본 생성자가 있어야 한다. 그렇지 않으면 오류가 발생한다.
public interface PostRepository extends JpaRepository<Post, Long> { }
PostRepository의 코드이다. PostRepository는 Spring Data JPA를 사용한 것인데, 엔티티에 대한 repository 인터페이스를 만들고 JpaRepository<(엔티티), (엔티티의 Id의 타입)> 를 상속받으면 기본 CRUD 를 제공한다. 이때, 엔티티의 ID 타입은 int와 같은 예약어를 사용하면 안되고, Long 과 같은 Class로 래핑한 타입을 사용해야 한다. 그래야 인식할 수 있다.
service
@AllArgsConstructor @Service public class PostService { private PostRepository postRepository; @Transactional public void createPost(String title, String content) { Post newPost = new Post(title, content); postRepository.save(newPost); } }
service 패키지의 PostService 클래스 코드이다. 스프링은 생성자를 통한 의존성 주입을 제공한다. 따라서 lombok의 AllArgsConstructor를 사용하여 postRepository에 의존성을 주입하도록 만든다. 일단은 엔티티를 생성하고 데이터베이스에 추가하는 것까지 구현했다.
controller
@Controller public class MainController { @GetMapping("/") public String getMain() { return "main"; } @GetMapping("/create") public String getCreatePost() { return "create"; } }
MainController 클래스는 데이터 렌더링 및 라우터의 역할을 한다. 지금은 아직 구현하지 않았지만, spring의 Model 객체를 이용하여 thymeleaf를 통해 데이터를 렌더링할 것이다.
@AllArgsConstructor @RestController public class PostApiController { private PostService postService; @PostMapping("/api/post") public void createPost(@RequestBody String title, @RequestBody String content) { postService.createPost(title, content); } }
PostApiController 클래스이다. POST, PUT, DELETE 메소드를 처리하기 위해 만들었다. 원래 GET 또한 API를 통한 데이터로 제공해야 하지만, jquery로 데이터를 받아 화면에 나열하는 것이 까다롭기 때문에 위 세 개의 메소드만을 처리할 것이다.
테스트 코드
@SpringBootTest public class PostServiceTests { @Autowired private PostService postService; @Autowired private PostRepository postRepository; @AfterEach public void afterEach() { postRepository.deleteAll(); } @Test public void createPostTest() { postService.createPost("테스트1", "테스트 내용1"); // test Post findPost = postRepository.findAll().get(0); assertThat(findPost.getTitle()).isEqualTo("테스트1"); assertThat(findPost.getContent()).isEqualTo(("테스트 내용1")); } }
오늘 구현한 createPost에 대한 테스트 코드이다. 테스트를 진행하는 중에 service 안의 postRepository에서 NullPointerException이 발생했는데, 원인은 @NoArgsConstructor를 사용했기 때문이었다. Service 클래스나 Controller 클래스는 반드시 의존성 주입을 받아야 하는 필드 객체가 있는데, NoArgsConstructor는 매개변수로 아무것도 받지 않는 생성자이기 때문에 필드 객체가 null로 남아있게 된다. 따라서 의존성 주입을 받아야 하는 클래스는 NoArgsConstructor를 사용하면 안된다.
반응형'프로그래밍' 카테고리의 다른 글
5. 블로그 프로젝트 (0) 2022.07.17 4. 블로그 프로젝트 (0) 2022.07.09 3. 블로그 프로젝트 (0) 2022.07.06 2. 블로그 프로젝트 (0) 2022.07.05 IntelliJ 실수 되돌리기 (0) 2021.11.13