mjeongriver
article thumbnail
Published 2023. 2. 9. 17:52
day82-spring boot TIL/Spring boot

1. 스프링 vs 스프링 부트

 

 

2. 다운로드 - spring 홈페이지에서 project - springtool4

 

스프링 부트는 최신 버전으로 다운로드 받아줍니다.

 

3. 실행

1) new Spring stater project

 

기존 spring 들어가서  spring stater project, 3번째 사진은 기본 패키지가 되기 때문에 후에 변경이 까다롭다! 그래서 잘 지을 것! 6~9번 사진으로 세팅 할 것

 

2) 서버 실행 방법

 

빨간색 버튼으로 누르고 실행할 것! ctrl+f11 아님, 3번째 사진에 oracle에서 포트번호 사용하고 있어서 포트번호 새로 부여

 

3) 포트번호 부여

 

포트번호 새로 부여하고 저장 후 서버 다시 실행, 3번째 사진처럼 컬러풀 해제(렉이 엄청나게 발생할 수 있음)

- 서버는 실행 했지만 화면은 뜨지 않음(스프링 부트는 화면 자체가 없음)

 

4) 패키지 생성

 

자바 run 환경이 com.simple.basic에 있어서 여기 하위 패키지로 들어가야 파일을 인식할 수 있음!

- 패키지 클릭하고 패키지 안에 패키지 생성!

- 스프링 부트는 리로드가 엄청 빠르다.

- 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 파일 실행

 

연결 프로그램을 반디집으로 바꾸고 contents.zip만 꺼내줘도 되고, jar 파일 더블 클릭해서 설치해도 됨!

 

 

- work 파일 생성한 후 sts로 들어가서 exe 파일 실행 시키기!

- 경로 바꿔줄 것!

- 들어가서 설치할 것

- help에서 eclipse marketplace 들어가기(위에 사진 2개 설치), restart now 선택

- 인코딩 설정할 것(css, html)

 

6) 다시 프로젝트 생성

 

4번째 사진은 베이스 패키지가 되니까 설정 잘해줄 것!

 

- 메이븐 레파지토리에서도 찾을 수 있음

 

버전을 생략하면 스프링 버전에 맞춰줍니다.

 

얘도 추가해줄 것!

 

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 나옴

 

build-gradle에서 gradle - refresh gradle project 선택

 

2] 뷰 선택(1)

 

3번째 사진 tomcat 버전 확인

 

- 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 개발(방법론)과 테스트 코드

 

build.gradle 보면 dependencies에 테스트 들어가 있음, BootTest 하고 ctrl+f11 후 junit 실행

 

* 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] 빌더 패턴(디자인 패턴)

 

6번째 사진: 과정 후에 내 자신으로 리턴

 

- 맨 마지막 사진에서 화면에서 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
profile

mjeongriver

@mjeongriver

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그