JAVA_SPRING/SPRING BOOT

SPRING BOOT)스프링 부트를 이용한 간단한 게시글 페이지 설계 - 1

Imaspear 2020. 11. 7. 00:03
728x90

 

블로그 리스트 출력하겠습니다. 

SPRING BOOOT 프레임 워크를 사용해서 게시글을 설계할 생각입니다. 

 

 

 

 

개발 환경

  • 개발 툴
    • Eclips
    • IntelliJ
    • VSCode
  • JAVA(jdk) 

 

 

Spring Boot) STS4 설치/다운로드 (Spring Tool Suites4)

STS4설치하려고 구글에 검색하니까 잘 안나오더라구요...ㅋㅋ 그래서 저도 찾으려고 영어로 치고 별에 별짓을 다 했습니다. 아래 링크에 들어가면 OS별로 STS4 설치할 수 있는 압축 파일을 다운로

imspear.tistory.com

 

 

우선 프레임워크를 이용해 기본 세팅을 설정하겠습니다. 아래 링크를 따라가 생성해주면 됩니다. 만약 사용하는 개발 툴에서 스프링 프레임워크를 지원해준다면 개발 툴에서 생성해도 됩니다. STS4 같은 경우에는 개발 툴에서 편리하게 생성할 수 있더라구요. 

 

http://start.spring.io

 

 

 

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 를 사용해도 좋습니다.  

 

 

 

Open Project from FIle System 클릭 

 

 

마지막으로 Finish 클릭 

 

 

 

아래 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는 저장소에서 데이터를 입출력하는 역할을 합니다. 

src\main\java\com\thisisspear\ThisisBlog\ 안에 config, controller, domain, 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을 이용해도 빨간줄이 나온다면 아래의 링크를 따라가 확인하면 됩니다. 

 

imspear.tistory.com/61

 

이클립스 롬복에서 빨간줄(오류)이 계속 나오다면( 개발 툴내에 lombok 설정하기)

간단하게 롬복을 설치해서 이클립스에 넣어주면 됩니다. 만약 인텔리제이 개발 툴을 이용하고 계시다면 아래의 링크를 따라가 확인하시면 됩니다. https://imspear.tistory.com/17 인텔리제이 롬복에서

imspear.tistory.com

imspear.tistory.com/17

 

인텔리제이 롬복에서 빨간줄(오류)이 계속 나오다면( 개발 툴내에 lombok 설정하기)

안녕하세요 여러분~ 개발하다 보면 나오는 오류들.. 우선 스프링 부트에서 Developer tools에서 lombok을 설정하여도 빨간 줄은 계속 나오죠... 스프링 부트를 이용하면서 롬복 어노테이션을 지정해도

imspear.tistory.com

 

 

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을 이요하고 싶으면 아래의 포스트를 확인하면 됩니다. 

 

imspear.tistory.com/104

 

h2 콘솔(localhost:8080/h2-console) 이용하기

localhost:8080/h2-console 특별하게 포트번호를 바꾸지 않았다면 위 URL로 들어가면 됩니다.  프로젝트를 실행시키면 아래 'jdbc:h2:meme:11~'라고 적힌 문구가 있습니다. 이걸 복사해서 아래 JDBC URL에 입력.

imspear.tistory.com

 

이렇게 글자를 쳐도 되고 왼쪽에 BLOG를 더블클릭하면 아래와 같은 글자가 입력 됩니다. 

Ctrl+Enter를 누르면 실행된다네요

 

이렇게 실행되는 걸 볼 수 있습니다. 

 

 

이번 첫 번째 게시글에는 JPA 데이터를 이용해 H2 database의 임시 저장소에 저장과 데이터를 H2 콘솔에 띄웠습니다. 

 

 

앞으로 임시 데이터를 이용해 웹페이지 출력하는 걸 우선적으로 해보고, MYSQL에 데이터 저장, REST API를 이용해 각각의 데이터들을 뽑아 직접 화면을 출력하도록 해볼 생각입니다.