1. 스프링 vs 스프링 부트
2. 다운로드 - spring 홈페이지에서 project - springtool4
3. 실행
1) new Spring stater project
2) 서버 실행 방법
3) 포트번호 부여
- 서버는 실행 했지만 화면은 뜨지 않음(스프링 부트는 화면 자체가 없음)
4) 패키지 생성
- 패키지 클릭하고 패키지 안에 패키지 생성!
- 스프링 부트는 리로드가 엄청 빠르다.
- chrome에 http://localhost:8383/ 치고 엔터 치면 내가 쓴 sysout 글이 console에 올라감
- 리로드 할 때 sysout 글 수정하고 저장하면 자동 리로드 → 크롬창에서 엔터치면 다시 리로드된 내역이 console에 올라옴
- web-inf 폴더 생성 되면 지울 것!
- 밑에 사진처럼 수정하면 return에 실린 string 값이 나옴
* TestController
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 "실행됨!";
}
}
5) 끄고 새로 받은 exe 파일 실행
- work 파일 생성한 후 sts로 들어가서 exe 파일 실행 시키기!
- 경로 바꿔줄 것!
- 들어가서 설치할 것
- help에서 eclipse marketplace 들어가기(위에 사진 2개 설치), restart now 선택
- 인코딩 설정할 것(css, html)
6) 다시 프로젝트 생성
- 메이븐 레파지토리에서도 찾을 수 있음
1] 데이터 베이스 연결
- 마지막 사진처럼 뜨면 데이터 베이스 연결 완료
* 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
- 다 설정하고 나서 build-gradle에서 업데이트 해줄 것
- 서버 껐다가 키면 hikaripool 나옴
2] 뷰 선택(1)
- build gradle에서 dependecies에 넣을 것 메이븐 레파지토리에서 찾을 것
- 하고 나서 gradle update
- application-properties 수정
- 7번째 사진처럼 폴더 구조 만든 후에 home.html 만들고 확장자 jsp로 변경
- 하고 나서 위에 바로 밑에 코드 블럭 추가
- 11번째 사진처럼 경로가 맞아야 실행 됨. → com.simple.controller 하니까 오류 발생 했었음
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
* build gradle, application-properties, homecontroller
- 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.simple'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
//implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
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'
}
tasks.named('test') {
useJUnitPlatform()
}
- 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
##jsp를 뷰로 사용하려면 리졸버 뷰를 선언합니다.
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
- homeController
package com.simple.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home";
}
}
- 뷰 선택(2)-타임리프 뷰(중복해서 사용이 불가능 합니다! 하나만 써야 됨)
- 하고 나서 gradle 업데이트 해줄 것!
- template에 home.html 생성하기
- 4번째 처럼 생성되는 이유: 물리적 구조가 다르기 때문에 잡아줘서 아래에 생성되는 것
- 5번째 사진 처럼 webInf 폴더 지우고 templates에 다시 생성해줄 것
- 뷰는 선택할 수 있다(타임리프, jsp 둘 중 선택하기) +) 리액트도 붙여서 사용할 수 있음
3] 스프링 부트에서의 개별적인 bean 설정
- 패키지 생성
* WebConfig, TestBean
- webConfig
package com.simple.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.simple.basic.controller.HomeController;
@Configuration //개별적인 스프링 빈 설정 파일
public class WebConfig implements WebMvcConfigurer{
//빈을 확인할 수 있는 장소(스프링 컨테이너)
@Autowired
ApplicationContext applicationContext;
//properties 파일에 선언된 변수를 바로 참조
@Value("${server.port}")
String port;
@Bean //해당 메서드 실행 하게 됨
//반환이 없다는 것은 빈으로 직접적인 생성은 아닌데 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 c = applicationContext.getBeanDefinitionCount();
System.out.println("빈의 갯수:" + c);
System.out.println("properties에 선언된 값:" + port);
}
@Bean //해당 메서드 실행 하게 됨
public TestBean testBean() {
// System.out.println("테스트빈 실행됨2");
return new TestBean(); //빈으로 등록
}
}
- testbean
package com.simple.basic.config;
public class TestBean {
public void hello() {
System.out.println("hello");
}
}
4] TDD 개발(방법론)과 테스트 코드
* BootTest
- bootTest
package com.simple.basic;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.simple.basic.controller.HomeController;
@SpringBootTest //스프링 부트 테스트 클래스
public class BootTest {
@Autowired
HomeController homeController;
@Test
public void testCode01() {
System.out.println(homeController.home());
}
}
5] 빌더 패턴(디자인 패턴)
- 맨 마지막 사진에서 화면에서 run as 하고 junit 선택하면 결과값 나옴
* builderVO, BootTest
- BuilderVO
package com.simple.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 클래스를 반환
//static은 외부에서 호출이 가능하다.
public static Builder builder() {
return new Builder();
}
//8. toString 오버라이딩
@Override
public String toString() {
return "BuilderVO [name=" + name + ", age=" + age + "]";
}
//2. 내부 클래스를 생성: 클래스 안에 클래스
public static class Builder {
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);
}
}
}
- bootTest
package com.simple.basic;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.simple.basic.command.BuilderVO;
import com.simple.basic.command.BuilderVO.Builder;
import com.simple.basic.controller.HomeController;
@SpringBootTest //스프링 부트 테스트 클래스
public class BootTest {
// @Autowired
// HomeController homeController;
//
// @Test
// public void testCode01() {
// System.out.println(homeController.home());
//
//
// }
@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());
}
}
- 너무 어려우면 이 사진은 꼭 알아둘 것! (생성할 일은 많지 않지만 빨간색으로 체크한 것처럼 씀)
'TIL > Spring boot' 카테고리의 다른 글
day88-spring boot (0) | 2023.02.17 |
---|---|
day86-spring boot (0) | 2023.02.16 |
day85-spring boot (0) | 2023.02.15 |
day84-spring boot (0) | 2023.02.14 |
day83-spring boot (0) | 2023.02.13 |