[Spring Boot 실전]0. 간단한 게시판을 만들어보자!
스프링 교재도 한 권 끝냈겠다.
원래 컴퓨터란 이론도 중요하지만 실전이 더 중요한 법!
그런 김에 간단한 CRUD 기능을 가진 게시판을 만들어보자!
스프링 부트 초기 세팅
스프링 부트를 사용할 것이기 때문에 위의 링크로 이동하면 spring boot 초기 세팅을 다운 받을 수 있다.
간단한 화면을 띄울 것이므로 Thmeleaf를 추가하고 웹 어플리케이션이기 때문에 Spring Web도 추가해준다.
물론! 프로젝트 내에서 gradle로 따로 추가할 수 있기 때문에 따로 추가를 하지 않아도 괜찮다.
GENERATE를 하면 압축된 파일이 다운로드 되는데, 이를 압축해제하고 intelliJ에서 열어주면 세팅은 끝이다.
비즈니스 모델 정하기
프론트엔드는 실질적인 화면이 어떻게 구성되고 움직이느냐가 매우 중요하다.
그렇다면 눈에 보이지 않는 백엔드는 어떤 것이 중요할까?
아직 취준생 개발자(꼬꼬마)이지만 필자는 비즈니스 모델을 짜는 것이 매우 중요하다고 생각한다.
백엔드라는 분야 특징 상, 데이터와 서버, 네트워크에 대한 기본 지식을 가지고 어떻게 데이터를 어떻게 효과적으로 이동시킬지 생각하는 게 중요하다.
따라서 지금부터 비즈니스 모델을 짜보자.
비즈니스 요구사항
필자가 개발하려는 게시판의 기능은 다음과 같다.
간단한 CRUD가 목적이므로 게시글 작성, 조회, 수정, 삭제가 있겠다.
그리고 데이터로는 게시글 제목, 게시글 내용, 작성자가 있다.
어플리케이션 계층 구조
컨트롤러 -> 서비스 -> 레포지토리 -> 데이타베이스
\ ㅣ /
도메인
도메인 : 비즈니스 모델의 도메인 객체로 여기서는 회원, 게시글 등이 되겠다.
컨트롤러와 서비스, 레포지토리에 모두 접근할 수 있다.
컨트롤러 : 웹 MVC에서 Controller 역할로 데이터와 비즈니스 로직 사이의 상호 동작을 하며, 주로 API의 요청을 받는다.
서비스 : 핵심 비즈니스 로직을 구현하며, 어떤 순서로 작업이 수행되어야 하는지 등을 알려준다.
리포지토리 : 데이터베이스와 접근하며, 도메인 객체를 데이터베이스에 저장하고 관리한다.
도메인 객체 만들기
비즈니스 모델을 작성하였으니, 우선 도메인 객체인 Article 클래스를 생성하여 보자.
@Getter // Lombok 의존성을 추가하여, getter와 setter를 자동 생성해준다.
@Setter
public class Article {
private Long id;
private String title;
private String content;
private String writer;
public Article() {}
public Article(Long id, String title, String content, String writer) {
this.id = id;
this.title = title;
this.content = content;
this.writer = writer;
}
@Override
public String toString() {
return "Article{"+
"id="+id+
", title="+title+
", content="+content+
", writer="+writer+"}";
}
}
Article 도메인(클래스) 각 게시글의 id(고유 식별자)와 제목, 게시글 내용, 게시글 작성자에 대한 정보를 담고 있다.
다음으로 레포지토리 인터페이스를 작성해보자
public interface ArticleRepository {
Article save(Article article); // 해당 게시글 도메인을 저장하는 메서드
Optional<Article> findById(Long id); // id로 해당 게시글을 찾는 메서드
Optional<Article> findByTitle(String title); // 게시글 제목으로 해당 게시글을 찾는 메서드
Optional<Article> findByContent(String content); // 게시글 내용으로 해당 게시글을 찾는 메서드
Optional<Article> findByWriter(String writer); // 글쓴이로 해당 게시글을 찾는 메서드
List<Article> findAll(); // 조건 없이 모든 게시글을 찾는 메서드
}
레포지토리로부터 implements하여 사용할 것이기 때문에 메서드 정의만 해준다.
각각의 기능은 코드 내의 주석을 참고하자.