SPRING BOOT)스프링 부트를 이용한 간단한 게시글 페이지 설계 - 1
블로그 리스트 출력하겠습니다.
SPRING BOOOT 프레임 워크를 사용해서 게시글을 설계할 생각입니다.
개발 환경
- 개발 툴
- Eclips
- IntelliJ
- VSCode
- JAVA(jdk)
우선 프레임워크를 이용해 기본 세팅을 설정하겠습니다. 아래 링크를 따라가 생성해주면 됩니다. 만약 사용하는 개발 툴에서 스프링 프레임워크를 지원해준다면 개발 툴에서 생성해도 됩니다. STS4 같은 경우에는 개발 툴에서 편리하게 생성할 수 있더라구요.
dependencies
- devtools
- lombok
- spring web
- hateoas
- thymleaf
- jpa repository
- h2 database
- validation
dependency는 devtools, lombok, spring web, hateoas, thymleaf, jpa repository, h2 database을 선택해주면 됩니다. 만약 하나를 빼먹거나 하나를 더 넣었다고 해도 다시 설정할 수 있으니 너무 염려치 않아도 됩니다.
다 설정하면 아래의 GENERATE 키를 누르면 됩니다.
원하는 곳에 알집을 풀어주고 자신이 원하는 개발 툴에서 열어주면 됩니다. 저는 STS4를 이용해볼 생각입니다. 인텔리제이, VSCODE 를 사용해도 좋습니다.
아래 pom.xml 파일을 작성해뒀습니다.
가끔 pom 파일 안에 rest dependency가 존재합니다. 그 경우는 spring 버전이 낮아 설정을 한거라 각 버전에 따라 pom dependency를 제대로 확인해야 합니다. 현재 spring 버전안에는 REST API를 따로 설정하지 않아도 지원하고 있습니다.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.BUILD-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.thisisspear</groupId>
<artifactId>ThisIsBlog</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ThisIsBlog</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
각각의 폴더안에 파일들을 작성하도록 하겠습니다.
만든 폴더 간 역할이 존재합니다. domain 폴더는 객체를 생성하는 파일들이 저장되고, controller는 웹 페이지와의 연결을 통해 데이터를 입출력 받는 역할, repository는 저장소에서 데이터를 입출력하는 역할을 합니다.
domain 폴더
우선 domain 폴더에서 객체를 생성할 수 있는 파일을 만들 겁니다. 우선 두 파일을 이용해 각각의 블로그와 블로그 안의 게시글을 생성할 수 있는 파일을 생성하도록 하겠습니다.
Blog.java
package com.thisisspear.ThisIsBlog.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.NotBlank;
import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@Data
@RequiredArgsConstructor
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
@Entity
public class Blog {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NonNull
@NotBlank(message = "blog title is blank")
private String title;
@NonNull
private String logoFile;
}
Post.java
package com.thisisspear.ThisIsBlog.domain;
import java.time.LocalDateTime;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.NotBlank;
import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
@Data
@Entity
@RequiredArgsConstructor
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
public class Post {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long id;
@NotBlank(message = "Title is empty")
private final String title;
@NotBlank(message = "Content is empty")
private final String content;
private final LocalDateTime regDate;
}
생성하는 도중 lombok을 이용해도 빨간줄이 나온다면 아래의 링크를 따라가 확인하면 됩니다.
repository 폴더
repository 같은 경우에는 JPA repository를 이용해 데이터를 저장하거나 삭제, 입력하는 방식을 택했습니다.
PostRepository interface 파일
우선 PagingAndSortingRepository<>를 상속받아 추후에 블로그 포스트들을 페이지 단위로 받을 생각입니다.
package com.thisisspear.ThisIsBlog.repository;
import java.util.List;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import com.thisisspear.ThisIsBlog.domain.Post;
public interface PostRepository extends PagingAndSortingRepository<Post, Long>{
List<Post> findByTitle(@Param("title") String title);
}
BlogRepository interface 파일
간단하게 JpaRepository<>를 상속받아 데이터들을 관리합니다.
package com.thisisspear.ThisIsBlog.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.thisisspear.ThisIsBlog.domain.Blog;
public interface BlogRepository extends JpaRepository<Blog, Long>{
}
config 폴더
cofig 폴더 안에 존재하는 LoadDatabase class 파일은 임시 데이터베이스안에 저장할 객체들을 생성하는 곳입니다.
BlogRepository 안에 저장함고 동시에 log.info() 메서드를 이용해 로그에 출력하도록 설정했습니다.
package com.thisisspear.ThisIsBlog.config;
import java.time.LocalDateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.thisisspear.ThisIsBlog.domain.Blog;
import com.thisisspear.ThisIsBlog.domain.Post;
import com.thisisspear.ThisIsBlog.repository.BlogRepository;
import com.thisisspear.ThisIsBlog.repository.PostRepository;
import lombok.extern.slf4j.Slf4j;
@Configuration
@Slf4j
public class LoadedDatabase {
@Autowired
PostRepository postRepository;
@Autowired
BlogRepository blogRepository;
@Bean
public CommandLineRunner blogList() {
return (args) -> {
int Blog_no = 1;
while(Blog_no < 10) {
log.info("Post Preloading"+blogRepository.save(new Blog("thisisstory"+Blog_no,"thisIsFilePath1"+Blog_no++)));
}
int Post_no = 1;
while(Post_no < 10) {
log.info("Post Preloading"+postRepository.save(new Post("thisistitle"+Post_no,"thisiscontent"+Post_no++, LocalDateTime.now())));
}
};
}
}
이클립스에서 스프링 부트 실행하는 방법
config안에 있는 LoadedDataedbase class 파일을 이용해 로그를 출력한 모습입니다.
http://localhost:8080/h2-console을 이용해 데이터를 확인할 수도 있습니다. h2-console을 이요하고 싶으면 아래의 포스트를 확인하면 됩니다.
이렇게 글자를 쳐도 되고 왼쪽에 BLOG를 더블클릭하면 아래와 같은 글자가 입력 됩니다.
이렇게 실행되는 걸 볼 수 있습니다.
이번 첫 번째 게시글에는 JPA 데이터를 이용해 H2 database의 임시 저장소에 저장과 데이터를 H2 콘솔에 띄웠습니다.
앞으로 임시 데이터를 이용해 웹페이지 출력하는 걸 우선적으로 해보고, MYSQL에 데이터 저장, REST API를 이용해 각각의 데이터들을 뽑아 직접 화면을 출력하도록 해볼 생각입니다.