원지의 개발
article thumbnail
728x90

Spring boot 학습목표

  1. gradle빌드툴
  2.  builder패턴
  3. 타임리프 뷰 템플릿
  4. 유효성 검사 방법
  5. Persistentent Framework(영속성 프레임워크) 마이바티스
  6. JPA and hibernate란?
  7. 메시지컨버터 REST API
  8. 판매자 매니저 프로젝트

Spring vs Spring boot

  • 표준 프레임워크(전자 정부 프레임워크)의 사용으로 spring 또한 소홀해서는 안됨

  Spring Spring boot
프로젝트의 구조 MVC2 MVC2
빌드 툴
- 라이브러리 다운, 컴파일, 배포 전 합쳐주는 것
메이븐 그레이들 
빌드 설정파일 Pom.xml Build.gradle
스프링 설정파일 xml파일 JAVA파일 and Application.properties 
설정 방식 수동  자동
JDBC Mybatis Mybatis  and JPA(API)
View에 대한 처리 JSP  Thymleaf(HTML) or JSP 등등 
어노테이션 기존 기존 +
  • Spring boot는 화면을 선택적으로 가져다 붙임
    View가 없고, 본인이 선택 - Thymeleaf, JSP, React, 웹플럭스 등

핵심 동작 구조

  • 스프링 부트에서는 브라우저 - dispatcherServlet 이하는 동작을 내부적으로 자동으로 처리함

gradle (그레이들)

  • 도구이며, Spring의 Maven과 같은 기능
  • 라이브러리 연결, test, 빌드(배포를 위한 준비) 하기 위한 플랫폼
  • 메이븐의 xml의 단점을 보완하여 새롭게 개선된 빌드
  • Script 형식의 사용
  • 다운된 라이브러리의 경로 - C:\Users\user\.gradle\caches\modules-2\files-2.1
plugins {
	id 'java'
	id 'war'
	id 'org.springframework.boot' version '2.7.8'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}
  • Spring boot 프로젝트 생성하면 gradle 자동으로 생성

Spring에서 Spring boot 사용

프로젝트 생성

  • spring boot 프로젝트는 Spring Starter Project

  • 버전에 따라서 라이브러리 모듈이 될수도 안될수도 있으므로 버전 잘 맞추기
  • 사용할 라이브러리 선택

  • boot 프로젝트를 생성하면 선택한 라이브러리들이 자동으로 생성

Spring boot - 내장 톰캣

  • Spring boot는 내장 톰캣을 가지고 있으므로 서버를 버튼으로 실행해야 함

  • 콘솔창 색상을 꺼야 빨라짐

실습

  • 서버 연결 안 함

application.properties

server.port=8383
  • 속성값으로 서버 포트 변경 가능

BootTestApplication.java

ServletInitializer.java

파일은 자동생성

  • Spring boot는 base 패키지 밑으로 들어가야 인식
    ▶ 자바 run 환경이 base 패키지 밑에 들어가 있기 때문에

com.example.basic.controller - TestController.java

  • base 패키지 밑에 controller 패지키 생성 후, 파일 만들어서 getMapping
  • 요청해서 콘솔로 확인

TestController.java

package com.example.basic.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController //스프링부트는 RestController에 특화됨
public class TestController {

	@GetMapping("/")
	public String test() {
		return "실행됨~~";
	}
}
  • Spring boot는 RestController 적으면 실행

Spring boot 4

설치

더보기

1. 압축 해제 해서 다운

2. contents.zip 파일 꺼내기

work 폴더 생성
  • 설치하면 STS 나옴
  • 작업할 work 폴더 생성

개발환경 구축

플러그인 설치

  • 마켓플레이스에서 플러그인 enterprise java web developer 설치
    ▶ HTML, js, java 파일 생성할 수 있는 기능 (안 받으면 수동으로 쳐서 생성 해야함)

인코딩

  • workspace, css, HTML files 인코딩 확인

프로젝트 생성

  • create new Spring Starter Project 로 프로젝트 생성

  • Type: Gradle Project
  • Pakaging: War / Jar
  • Java Version: 11버전 이상으로
  • Language: Java
  • Group & Artifact: 기본 패키지로 고치기 까다로워서 신중히 할 것
  • Pakage: group&artifact 같음 - 모든 파일이 이 패키지 아래로 들어가야 함
  • Spring Boot version: 2.7.8 - 버전에 따라서 라이브러리 모듈이 될수도 있고, 안될수도 있음
최소한의 dependency
Spring Boot DevTools - 서버 재시작 없이 변경 가능
Sprign Web - spring core 들어가 있음
Lombok
Spring Data JPA
MySQL Driver
Oracle Driver //데이터베이스 커넥터 까지는 필수

디렉토리 확인

  • 모든 파일들은 base 패키지 밑으로 들어가야 읽힘
  • src/main/resources - templates (패키지면서 폴더, 화면 코드 작성하는 곳)
  • src/main/resources - application.properties
    키, 값 받아서 설정하는 파일, spring의 property
    런타임 시 다양한 환경에서 동작할 수 있도록 필요한 옵션들을 제공하는데 사용 
    • 서버 포트 번호 변경
    • 데이터베이스 연결
    • 히카리풀 연결
    • 커넥션풀 연결
    • 마이바티스 관련 매퍼 설정
    • jsp를 뷰로 사용 - 리졸버 뷰 선언
  • build.gradle - gradle 설정 파일 (spring의 pom.xml)

Database 선택 - Application.properties

  • 데이터베이스 연결과 커넥션 풀 연결을 자동 처리
  • 프로젝트 실행 시 데이터베이스 연결이 반드시 선행 작업이 되어야 함

Application.properties

★ 띄어쓰기 없이 써야함

1. 서버 포트 변경

server.port=원하는 포트 번호(8383)

 

2. 데이터베이스 연결

  • 히카리풀, 커넥션풀 자동으로 연결

- Oracle

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul
spring.datasource.username=spring
spring.datasource.password=spring

- MySQL

spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul
spring.datasource.username=spring
spring.datasource.password=spring

 

3. DB생성과 계정 생성 예시

build.gradle 파일 추가 + View 선택

build.gradle

plugins {
	id 'java'
	id 'war'
	id 'org.springframework.boot' version '2.7.8' //스프링 버전 바꾸기
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {

	implementation 'org.springframework.boot:spring-boot-starter-web' //레파지토리 가져와서 뒤의 숫자 지우면 자동으로 스프링 버전에 맞춰서 들어감
	//implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 이거 안 집어넣어도 됨
	
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'com.mysql:mysql-connector-j'
	runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
	annotationProcessor 'org.projectlombok:lombok'
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	
	//jsp를 뷰로 사용하려면 jsp 해석기, jstl 넣어줌
	//implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:9.0.71'
	//implementation 'javax.servlet:jstl:1.2'
	
	//타임리프뷰를 사용하려면
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	
    //유효성 검사 때 추가 된 부분
	//유효성 검사
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	
	//마이바티스
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2'
	
	//slq로그
	implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
}

tasks.named('test') {
	useJUnitPlatform()
}

 

Spring Boot Starter Data JAP

  • 레파지토리 가져와서 뒤의 숫자 지우면 자동으로 스프링 버전에 맞춰서 들어감
  • 스프링 부트용 Spring Data JPA 추상화 라이브러리

implementation 'org.springframework.boot:spring-boot-starter-web'

< View - jsp >

Tomcat Embed Jasper & JSTL

implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:9.0.71'
implementation 'javax.servlet:jstl:1.2'
  • jsp를 뷰로 사용하려면 jsp 해석기 + jstl을 넣어줌

Application.properties 추가

## jsp를 뷰로 사용하려면 리졸버 뷰 선언
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

< View - Thymeleaf >

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

home.controller 연결

HomeController.java

package com.example.basic.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

	@GetMapping("/")
	public String home() {
		return "home";
	}
}
  • @Controller 달기
  • 단지 화면을 띄우는 것으로 getMapping("/")일 경우 return home.html 연결

templates - Home.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	타임리프 뷰
	
</body>
</html>

개별적인 bean 설정

  • 스프링에서는 bean을 IOC컨테이너에 미리 생성 후 꺼내서 사용
  • 스프링의 xml ▶ 스프링부트의 java 로 생성
  • 웹 설정은 WebMvcConfigurer 인터페이스 구현 ▶ 그 다음에 빈 설정
    (스프링 버전에 따라서 하는 방법이 달라짐)
어노테이션 기능
@Configuration 스프링 설정 파일
@Bean 빈으로 등록
1. @PropertySource Application.properties를 상호 참조 가능
2. @Value Application.properties에 값을 직접 참조
값을 자바코드로 읽을 때 사용

2023.01.30 - [Server/Spring] - [Spring] 이클립스 STS, DI / IoC, Spring-context, 생성자&setter(DI), bean범위, 의존객체 자동주입, xml▶java

Application Context 참조

  • 스프링 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진
  • IoC 방식을 따라 만들어진 일종의 빈 팩토리

1. 기본 동작 원리

  • WebMvcConfigurer 를 구현하고 @Configuration으로 개별적인 스프링 빈 설정 파일로 만들어줌
  • @Bean은 빈을 실행하라는 어노테이션으로 빈으로 등록하려면 new Bean 으로 생성해야 함
  • 그래서 결과적으로 WebConfig 클래스에 TestBean이 빈으로 등록됨

2. 부가적인 커스터마이징

  • 필요없으면 안해도 되는데 부가적인 커스터마이징 같은게 필요하면 쓰면 됨

com.example.basic.config - WebConfig.java

package com.example.basic.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.example.basic.controller.HomeController;


@Configuration //개별적인 스프링 빈 설정 파일, spring에서 servlet-context.xml로 썼던거
public class WebConfig implements WebMvcConfigurer{

	//빈을 보관하고 있는 장소 (스프링 컨테이너)
	@Autowired //applicationContext를 주입해라
	ApplicationContext applicationContext;
	
	//application properties의 값을 직접 참조
	//properties 파일에 선언된 변수를 바로 참조
	@Value("${server.port}") //application properties 변수명
	String port; //이 변수에 담아줌
	
	@Bean //해당 메서드를 실행하게 됨, 실행하고 끝
	public void test() {
//		System.out.println("테스트 빈 실행");
//		return new 생성클래스(); 해야 빈이 등록됨
		
		TestBean t = applicationContext.getBean(TestBean.class);
		System.out.println(t);
		
		HomeController h = applicationContext.getBean(HomeController.class);
		System.out.println(h);
		
		int a = applicationContext.getBeanDefinitionCount();
		System.out.println("빈의 개수: " + a);
		
		System.out.println("properties에 선언된 값: " + port);
	}
	
	@Bean //해당 메서드를 실행하게 됨, 실행하고 나서 return으로 new 클래스()하면 ioc 컨테이너가 빈으로 보관함
	public TestBean testBean() { //수동!
		System.out.println("테스트 빈 실행2");
		return new TestBean(); //빈으로 등록
	}
	
}
  • MebMvcConfigurer를 구현하고, @Autowired 달기 - 빈을 보관하는 장소로 applicationContext를 주입해라
  • @Bean을 달아서 실행시키도록 함
  • applicationContext 안에는 @Controller로 생성한 Bean정보 확인 가능
    • applicationContext.getBean(빈이름.class) 으로 확인 하거나
    • @Value("application.property의 변수명") ▶ 담을 변수 설정 해서 확인 가능

com.example.basic.config - TestBean.java

package com.example.basic.config;

public class TestBean {

	public void hello() {
		System.out.println("hello");
	}
}

application.properties

server.port=8383

################### 데이터베이스 연결, 히카리풀, 커넥션 풀 자동연결 ###################
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.url=jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul
#spring.datasource.username=spring
#spring.datasource.password=spring

spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul
spring.datasource.username=spring
spring.datasource.password=spring



################### 마이바티스 관련 설정 ###################
# 매퍼 xml의 위치 - classpath:/ 리소스 폴더의 하위를 나타냄
mybatis.mapper-locations=classpath:/mapper/*.xml
# 단축명으로 사용할 클래스의 패키지명
mybatis.type-aliases-package=com.example.basic.command


## jsp를 뷰로 사용하려면 리졸버 뷰 선언
#spring.mvc.view.prefix=/WEB-INF/views/
#spring.mvc.view.suffix=.jsp
  • 이 파일에 있는 변수명을 타임리프식으로 가져가 쓰면 됨

TTD & 테스트 코드

  • TTD (Test Driven Development) 으로 테스트가 개발을 이끌어간다
  • 작은 단위 별로 테스트코드를 작성, 실행해서 잘 돌아가면 개발 코드로 옮김
  • JUNIT으로 실행 (ctrl + f11)
어노테이션 기능
@SpringBootTest 스프링 테스트 클래스로 사용하겠다
@Test 테스트로 실행

1. @Test 달고 바로 사용

package com.example.basic;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.example.basic.command.BuilderVO;
import com.example.basic.command.BuilderVO.Builder;
import com.example.basic.command.BuilderVO2;
import com.example.basic.controller.HomeController;

@SpringBootTest //스프링부트 테스트 클래스
public class BootTest {

	@Autowired //빈으로 등록되어 있어서 autowired 사용가능
	HomeController homeController;
	
	@Test
	public void testCode01() {
		System.out.println(homeController.home());
	}
}
  • @SpringBootTest 달고, 사용할 변수 선언 후 @Autowired
  • @Test 달고 메서드 적으면 됨
package com.example.basic.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

	@GetMapping("/")
	public String home() {
		return "home";
	}
}
  • 결과: home

2. TestMapper 사용


Builder

  • 스프링 부트에서는 Builder패턴을 좋아함
  • 어느 필드에 어떤 값을 채워야 할지 명확하게 알 수 있음
  • 가독성이 좋고, 순서 상관 x
  • 객체 불변성 보장 - 한 번 저장하면 불변
  • 객체를 얻기 위해서는 오직 Builder 클래스를 통해서만 가능
    기존 클래스의 setter 메서드와 public 생성자가 x
  • 첫 생성에 값 지정 ▶ 그 이후에는 값을 못바꾸게 할 때 쓰는 패턴

com.example.basic.command - Builder.java

package com.example.basic.command;

public class BuilderVO {
	//빌더 패턴의 모형 - 내부 클래스를 생성하고, 외부에서 호출시에 내부클래스 값을 지정
	//장점 - 객체의 불변성(값의 변경을 막고, 사용시 가독성이 좋다)

	//1.멤버변수
	private String name;
	private int age;

	//4. VO의 생성자
	private BuilderVO(Builder builder) {
		this.name = builder.name;
		this.age = builder.age;
	}

	//7.외부에서 객체 생성을 요구하면 내부에 있는 Builder클래스를 반환
	public static Builder builder() {
		return new Builder() {};
	}

	//8. toString 오버라이딩
	@Override
	   public String toString() {
	      return "Builder [name=" + name + ", age=" + age + "]";
	   }

	//2.내부클래스 생성 - 클래스 안에 클래스
	public static class Builder { //static으로 해서 외부에서 바로 접근 가능

		private String name;
		private int age;

		//3. 생성자 제한 - 생성자로 막으면 외부에서 직접 설정 어려움?
		private Builder() {}

		//5. 내부 클래스에 setter메서드 생성
		public Builder setName(String name) {
			this.name = name;
			return this;
		}

		public Builder setAge(int age) {
			this.age = age;
			return this;
		}

		//6. build 메서드를 생성 - 나 자신을 외부클래스에 저장하고 반환
		public BuilderVO build() {
			return new BuilderVO(this); //여기의 this는 4번의 BuilderVO
		}


	}

}
  • Builder 클래스의 모형
  • 내부 클래스가 존재 - 클래스 안의 클래스

BootTest.java

package com.example.basic;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.example.basic.command.BuilderVO;
import com.example.basic.command.BuilderVO.Builder;
import com.example.basic.command.BuilderVO2;

@SpringBootTest //스프링부트 테스트 클래스
public class BootTest {
	
	//builder 패턴 객체의 사용
	//자주 사용하지는 않지만 형태나 사용하는 방법을 알아두세요
	@Test
	public void testCode02() {
//		Builder xx = BuilderVO.builder();
//		xx = xx.setAge(10);
//		xx = xx.setName("집가자");
//		BuilderVO vo = xx.build();
//		System.out.println(vo.toString());
		
		BuilderVO vo = BuilderVO.builder().setAge(10)
										  .setName("집가자")
									      .build();
		System.out.println(vo.toString());
		
		vo = BuilderVO.builder().setAge(20).
				  setName("ddd")
			      .build();
		
		System.out.println(vo.toString());
		
		BuilderVO2 vo2 = BuilderVO2.builder()
				   					  .name("동키") //name 저장
				   					  .age(30) //int 저장
				   					  .build();
		
		System.out.println(vo2.toString());
		
	}
}

https://dreamcoding.tistory.com/56

 

[디자인 패턴] 빌더 패턴(Builder Pattern)

스프링 인 액션 5판 스터디를 진행하던 중에 스프링 시큐리티에서 빌더 패턴이 사용되는 부분을 보고 빌더 패턴에 대한 포스팅을 해보겠습니다. 빌더 패턴은 소프트 웨어 디자인 패턴 중에 하나

dreamcoding.tistory.com

Lombok을 이용한 builder 패턴 자동 생성 가능


오늘 하루

더보기

기억에 남는 부분

 

어려운 부분

 

문제 해결 부분

 

728x90
profile

원지의 개발

@원지다

250x250