바트심슨으로 하루만 살고 싶다

[스프링 부트] #1 : 다운로드 및 Maven 프로젝트 생성 및 실행해보기, 테이블 만들어보기 본문

Java/Spring

[스프링 부트] #1 : 다운로드 및 Maven 프로젝트 생성 및 실행해보기, 테이블 만들어보기

바트심슨바게트 2023. 2. 20. 18:19

스프링 부트를 시작하기 전 스프링 부트에 대해서 간략하게 알아보자.

스프링 부트란?

스프링 프레임워크를 사용 가능한 상태로 만들어 주는 도구

처리 영역에 대한 프레임워크의 특징


스프링 부트의 장점

  • 라이브러리 관리 자동화 : 스타터를 이용해 라이브러리 의존성을 더욱 간단히 처리할 수 있다.
  • 설정의 자동화 : 실행에 필요한 환경을 자동으로 설정해 준다.
  • 라이브러리 버전 자동관리 : 호환되는 버전으로 다운로드해 준다.
  • 테스트 환경(JUnit)과 내장 톰캣

스프링 부트 설치하기 후 실행하기

1. 전자정부 프레임 워크 - 개발자 교육 - 교육 자료에서 표준프레임워크 개발자 교육 교재 및 실습 for Win (V4.0.0) 선택

링크 표준프레임워크 개발자 교육 교재 및 실습 for Win (V4.0.0)

 

교육자료 | 표준프레임워크 포털 eGovFrame

처리중입니다. 잠시만 기다려주십시오.

www.egovframe.go.kr


2. 압축 파일 다운로드 후 C드라이브에 압축 풀기

압축 파일을 C드라이브 경로에 풀기 !


3. eclipse.edu를 열어준다.

그럼 아래와 같은 Package Explorer를 볼 수 있다 (Server를 제외하고 삭제함)

프로그램 실행시 보이는 화면


4. 프로젝트 생성하기 

New File - Project - Spring 검색 후 Spring Start Project 생성 후 아래의 과정을 진행한다.

프로젝트 기본 설정

 - Name, Group 을 따로 이름을 지정해 준다.
- Type : Maven  /  Pakaging : Jar  /  Language : Java  /  Java Version : 8로 설정해 준다.

스프링 부트에서 사용할 라이브러리 선택

처음 만드는 프로젝트 파일이므로 기본적인 것만 추가하였다.


스프링 부트 프로젝트 구조

프로젝트 생성시 기본 레포 구조

프로젝트 생성 시 지정한 패키지에 프로젝트 이름 + Application형태의 자바 애플리케이션이 존재한다.

  • src/main/java
    • 자바 클래스 (Controller , Service , Repository , Entity )
    • 우리가 만들 애플리케이션의 실행이 이루어진다.
  •  src/main/resources
    • 자바가 아닌 파일 ( XML / Properties )
    • static : 정적 웹 콘텐츠 저장 ( css, js ...)
    • templates : 템플릿 기반의 웹 리소스 저장
    • application.properties : 프로젝트에서 사용할 정보 저장 
  • src/test/java
    • 모듈을 테스트하는 경우 사용한다. (JUnit 기반의 테스트 코드)

1. pom.xml 에서의 parent

프로젝트 생성 후 pom.xml을 살펴보면, 다음과 같은 부분이 있다.

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.8</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

<parent>를 우선 살펴보자 spring-boot-starter-parent는 스프링 프레임 워크가 제공해 주는 것으로, 이곳에 이미 우리가 활용할 수 있는 많은 라이브러리 정보가 담겨 있다.

parent에서 dependency로 들어오는 외부 라이브러리들의 버전 및 각 라이브러리들의 의존성을 관리한다고 보면 된다.


2. pom.xml에서의 dependencies

pom.xml에서 다음을 살펴보면

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
</dependencies>

parent의 버전에 따라 spring-boot-starter-web과 의존하는 라이브러리들 모두를 임포트 한다.
의존하는 라이브러리들 역시 이미 선언이 되어있기 때문에 따로 버전을 명시해 줄 필요는 없다.
(다만 parent에서 가지고 있지 않은 외부 라이브러리 목록은 버전을 명시해 줘야 한다.)


** 만약 dependency를 추가하고 싶다면, dependencies에서 자동완성 기능 (Crtl + Space bar)을 통해

Add Starters 클릭 시 하단의 사진과 같은 화면을 볼 수 있다.
- 스프링 부트 스타터를 다시 작동해
라이브러리의 패키지들을 불러올 수 있다.

이곳에서 추가로 설정할 라이브러리들을 지정한다.

( 추가 시 pom.xml 체크하기 )

MySQL 라이브러리 추가하기
MySQL에 대한 Dependency가 추가된 모습


자동 설정 이해

1. Application.java

스프링 부트 프로젝트는 레거시와는 다르게 별도의 설정 없이 바로 실행 가능한데, 아래의 클래스가 바로 
실행의 구동부라고 볼 수 있는 Application.java이다.
별도의 설정을 하지 않아도 되는 이유를 알아보기 위해 Application을 살펴보면

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class A0220Application {

	public static void main(String[] args) {
		SpringApplication.run(A0220Application.class, args);
	}

}
  • @SpringBootApplication  : 메인 클래스 위에 기본적으로 설정되는 어노테이션이며, 
    아래의 3개의 어노테이션이 합쳐져 있다고 볼 수 있다. 

    • @SpringBootConfiguration :스프링 부트는 스프링컨테이너를 구동할 때, 두 단계로 나누어 객체를 생성한다.
      • @ComponentScan이 동작하여 사용자가 작성한 객체들이 생성됨
      • @EnableAutoConfiguration에 의해 자동설정 클래스에 의해 객체들이 생성됨
    • @EnableAutoConfiguration : 자동 환경설정
      • @EnableAutoConfiguration에 의해 자동설정 클래스에 의해 객체들이 생성됨  
      • org.springframework.boot:spring-boot-autoconfigure 패키지 내부의 META-INF/spring.factories 를 보면 자동 설정의 대상이 되는 클래스들이 정의되어 있다. 
        (자동 설정 : 조건에 따른 Bean등록, Path 설정 등의 기본 설정을 말하며 스프링 부트가 미리 정의해 놓은 값이다.)
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\

...
  • 이곳에 포함되는 모든 라이브러리들은 기본 값 자동 설정이 지원된다.    

  • @ComponentScan 
    • @ComponentScan이 동작하여 사용자가 작성한 객체들이 생성됨 
    • @Configuration, @Repository, @Service, @Controller, @RestController가 
           붙은 클래스의 객체를 메모리에 생성 ( 모든 Component를 스캔한다 )
  • @RestController 
    • rest 방식의 응답을 처리하는 컨트롤러를 구현할 수 있다.
    • 리턴되는 문자열이 브라우저에 그대로 출력되기 때문에 별도로 view 화면이 필요 없다.

application.properties

스프링에서 application.properties에서 앱의 환경설정을 관리하는 파일이기 때문에 환경설정을 이곳에서 작성한다.
런타임 시 다양한 환경에서 동작할 수 있도록 필요한 옵션들을 제공하는 데 사용된다.

- 우클릭 후 open with - Generic Editor -Spring Properties 클릭 후 설정 작성 ( 자동 완성 기능이 사용가능해짐)

server.port=8080
server.servlet.context-path=/boot
#server를 구동시키기 위해서는 servlet으로 설정
spring.main.web-application-type=servlet

yaml으로 Convert 한 경우 

server:
  port: 8080
  servlet:
    context-path: /boot
spring:
  main:
    web-application-type: servlet

둘 중 1가지를 사용해서 작성하면 된다. - 개발자에 따라서 작성하는 방식이 다르다.

http://127.0.0.1:8080/boot로 서버가 실행되는 것을 설정한 내용이다.


@RestController를 이용해 애플리케이션 실행해 보기

Application.java - 프로젝트의 이름이 A0220이기 때문에 A0220Application으로 이름 지정

package kr.sol;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class A0220Application {

	public static void main(String[] args) {
		SpringApplication.run(A0220Application.class, args);
	}

}

RestController 생성

package kr.sol.controller;

@RestController
public class HiController {
	
	@RequestMapping("/hi")
	public String hi() {
		return "hi";
	}
}

main을 실행하게 되면 컨트롤러에서 설정한 "/hi"로 오는 요청에 대해 응답해 준다.

Rest컨트롤러에서 요청의 반환값인 문자열 "hi"가  http://127.0.0.1:8080/boot/hi 요청 시 출력되는 모습

RestController의 리턴되는 문자열이 출력되는 모습


테이블 만들기

MySql을 이용해 테이블을 생성해 보자.

VO 클래스는 보통 테이블의 칼럼 이름과 동일한 private 멤버변수를 가진다. 레거시에서는 Getter와 Setter를 작성해

소스코드가 지저분해지고, JPA에서 사용할 클래스에 일일이 Getter, Setter메서드들을 작성해 주는 것이 번거롭기 때문에 사용하는 것이 Lombok이다.


Lombok

자동으로 생성자. getter/setter toString과 같은 코드들을 자동으로 추가해 준다
아래와 같은 어노테이션들을 Lombok이라고 한다.

@Data : @Setter, @Getter, @ToString, @RequiredArgsConstructor 가 자동으로 생성된다.

스프링 부트 프로젝트 생성시 Lombok 추가 - pom.xml


MySQL 실행 전 반드시 실행해 주어야 하는 프로그램

startup.bat를 실행 - MySQL의 DB 연결작업 시 실행해 주어야 한다.


이곳에서 DB 연동을 작성한다.
com 더블 클릭시 MySQL이 연동된 모습
db의 properties 세부 설정을 변경

비밀번호와 유저 이름은 하단의 사진 경로의 mysql 참고.txt 파일에 존재한다.

mysql&nbsp; 참고 txt 위치


DB 설정 - properties에서 정보 입력

#DB 연결 정보
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/com
spring.datasource.username=com
spring.datasource.password=com01

application.properties에 MySql을 사용하기 위한 정보를 설정해준다.

#베너 없애는 방법
spring.main.banner-mode=off

#Mapper interface => SqlSessionFactoryBean
#Spring JPA => Hibernate (JPA 구현체) : sql query 빌드 (자동 생성)

#상세설정
#MySql 지정
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

#스키마 생성
spring.jpa.hibernate.ddl-auto=create

#실행되는 sql문 보일지 말지
spring.jpa.show-sql=true

#hibernate가 동작하면서 발생하는 sql문을 포멧팅해서 출력할것인지?
spring.jpa.properties.hibernate.format_sql=true

베너 없애는 방법, MySQL 사용시 상세설정을 지정할 수 있다.


 

이제 테이블을 생성하기 위해 JPA를 통해 자바 클래스를 기준으로 매핑할 테이블을 자동 생성할 수 있게 만들어보자.

이때 매핑되는 자바 클래스를 Entity라고 한다.

  • 스프링 부트에서는 VO(Value Object) 가 아닌 entity 라고 한다.
  • Entity 에도 마찬가지로 VO처럼 Getter와 Setter를 작성한다.  ( 생략 가능한 어노테이션 존재 - @Data)
  • DBCP를 사용하기 위해 레거시에서는 MyBatis 사용시 SqlSessionFactory를 사용했지만 
    부트에서는 ORM 기술인 Hibernate ( : JPA의 구현체 ) 를 사용한다.

entity 패키지를 생성해서 Board 클래스 생성

package kr.sol.entity;

//spring.jpa.hibernate.ddl-auto=create
//SessionFactory 시작시 스키마를 삭제하고 다시 생성한다.

//VO 또는 Bean으로 불렀지만 부트에서는 Entity로 부른다.
//자바 Bean으로 보자 , entity와 ORM 데이터 베이스와 연결
//Board가 데이터 베이스의 테이블과 마찬가지
@Entity
//@Data는 @Getter, @Setter, @ToString을 자동 설정해준다.
@Data
public class Board {
	//entity (Vo)  <==  ORM 객체 관계 매핑(JPA)  == > Table (데이터 베이스) 
	
	@Id //PK 값 지정
	//GeneratedValue : 자동으로 증가된 값을 할당할 때 자동 증가
	//IDENTITY : PK 값 설정
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long idx;
	
	private String title;
	private String content;
	
	//updatable = false : 업데이트 되지 않음 = 업데이트 문에 포함시키지 않겠다 선언
	@Column(updatable = false) // 테이블 속성으로 지정하는 어노테이션
	private String writer;
	
	//insertable = false : 인서트문에 포함시키지 않겠다. 
	//columnDefinition = "타입 default 디폴트값" 특정 필드의 타입을 지정 후 출력 가능
	// datetime default now() : 현재 시간으로 지정하겠다.
	@Column(insertable = false, updatable = false, columnDefinition = "datetime default now()")
	private Date dat;
	
	//int default 0 : 기본 변수 설정을 0으로 하겠다.
	@Column(insertable = false, updatable = false, columnDefinition = "int default 0")
	private Long count;
}

사용된 어노테이션

@Entity : VO 또는 Bean으로 불렀지만 부트에서는 Entity로 부른다.
자바 Bean으로 보자 , entity와 ORM 데이터 베이스와 연결, Board가 데이터 베이스의 테이블과 마찬가지

@Data : Getter, Setter, ToString을 자동 설정해준다.

@Id : 해당 컬럼을 PK로 지정한다.

@GeneratedValue(strategy = GenerationType.IDENTITY) : 기본 키 생성을 데이터베이스에 위임 즉, id 값을 null로 하면 DB가 알아서 AUTO_INCREMENT 해준다.

@Column : 테이블의 속성으로 지정
(updatable = false) : 업데이트문 실행 시 포함시키지 않겠다 선언

(insertable = false) : 인서트문 실행 시 포함시키지 않겠다 선언

(columnDefinition = "타입 default 디폴트값") : 특정 필드의 타입을 지정 후 출력 가능
   >> 예시 : datetime default now() : 현재 시간으로 지정하겠다.

(int default 0) : 기본 변수 설정을 0으로 하겠다.

이후 DB에 테이블이 만들어졌는지 확인하기 위해서 같은 패키지에 db.sql 확장자 파일 ( 이곳에서 결과물 확인 및 쿼리문 작성이 가능) 생성 후 select * from board; 쿼리문을 작동해 해당 테이블이 존재하는지 확인하기.

쿼리문 작성
콘솔창에서 볼 수 있는 테이블 구조

Comments