728x90
Spring boot 학습목표
- gradle빌드툴
- builder패턴
- 타임리프 뷰 템플릿
- 유효성 검사 방법
- Persistentent Framework(영속성 프레임워크) 마이바티스
JPA and hibernate란?- 메시지컨버터 REST API
- 판매자 매니저 프로젝트
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 파일 꺼내기
- 설치하면 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에 값을 직접 참조 값을 자바코드로 읽을 때 사용 |
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
Lombok을 이용한 builder 패턴 자동 생성 가능
오늘 하루
더보기
기억에 남는 부분
-
-
어려운 부분
-
-
문제 해결 부분
-
-
728x90
'Server > Spring boot' 카테고리의 다른 글
[Spring Boot] BootMyweb (3) - 파일 업로드, 불러오기, selectKey (0) | 2023.02.21 |
---|---|
[Spring Boot] RestAPI, 부메랑, @RestController, @RequestBody, CrossOrigin (0) | 2023.02.16 |
[Spring Boot] BootMyweb (1) - 관리자 홈페이지 / 기본 연결, 검색&Paging (0) | 2023.02.15 |
[Spring Boot] Valiadation(유효성 검사), MyBatis (0) | 2023.02.14 |
[Spring Boot] thymeleaf, ${#내장함수}, inline, 템플릿 (0) | 2023.02.13 |