프로젝트 생성
SpringBoot에서는 ContextPath 안잡음
spring boot version은 자바에 매칭해줘야함. or 오히려 더 낮게 매칭. => 2.x.x
3.x.x => java 11 이상부터 매칭
라이브러리 미리 로드
[선택사항]
lombook_vo에서 기본생성자, getter/setter 등 자동생성할 때 사용
JPA_mybatis 대체제
Thymeleaf_EL/JSTL 대체제
[필수사항]
Spring Web
Spring devtools
현재는 e_Gov에서 프로젝트 설정을 해줬지만 현업에선 아래 화면에서 설정해주는 경우가 많다.
application.properties
Spring에서
- Fc를 설정해주는 servlet-context.xml
- DB와 연결해주는 root-context.xml
- web.xml
=> 이 3가지를 포함하는 파일
src/main/resources
Spring에서
- WEB/INF/views/~.jsp
=> 이러한 jsp파일들을 src/main/resources에서 다룬다.
why? Spring처럼 사용하고 싶으면 별도로 잡아줘야하는 설정이 너무 많다!!
jsp 사용하는 이유는? --> java code 쓰고 싶어서
Spring boot + Thymeleaf(for FE+BE 소통 원활)
따라서, Spring boot에서는 html 사용!
디렉토리 구조
1. resources / static --> css, js(정적)
2. resources / templates --> html
SpringBoot에서 실행하는 방법
Boot Dashboard에서 실행시킬거임!
아래와 같은 오류가 뜨면 DB 설정이 없을 때 뜨는 오류!
따라서 DB없는 상황에서 실행하고싶으면 아래 pom.xml에서 JPA 라이브러리 삭제하고 실행!
SpringBoot는 Tomcat서버를 쓰지 않는다.
프로젝트 자체 내부에서 단위로 서버가 내장되어 있다.
따라서 아래와 같이 port번호 오류가 뜨면
application.properties에서 port번호 변경!
★application.properties에서 자동완성으로 코드를 작성하고 싶으면
아래와 같이 화면을 열어야 함!!★
# Spring Boot 특징
# 1. 서버가 내장되어 있다.
# --> 서버의 포트번호 변경
server.port=8090
한글로 주석이 되어 있기 때문에 아래같은 오류창이 뜨면 'Save as UTF-8' 을 클릭해주면 됨!
DB연결
SpringMVC DB연결 필요한 라이브러리
- mysql driver
- hikariCP
- mybatis
- mybatis-spring
- spring-jdbc
Sprinb Boot에서 필요한 라이브러리
- mysql driver
- JPA
=> 나머지는 Spring Boot 내부에 모두 존재!
=> 라이브러리를 로드하고 나면, Spring boot에서는
DB연결할거라고 판단해서, 연결설정이 잡혀져있는지 확인
안잡혀있다면 실행이 안됨!
pom.xml
<dependencies>
<!-- Spring Boots는 자동으로 프로젝트와 호환되는 라이브러리 버전을 가져온다.
: 버전작성 X
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
application.properties
# 2. DB 연결설정
# DBCP(DataBaseConnectionPOOL)
# url, username, password, driver
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
mybatis 캐치프라이즈
--> java 코드(인터페이스)와 sql구문(xml)을 분리
--> mapper --> mapping(java와 sql연결)
JPA 캐치프라이즈
--> NO SQL(SQL 구문을 쓰지 말자!!)
--> repository
SpringBootStartApplication.java
package com.smhrd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// Springboot 시작점(핵심!)
@SpringBootApplication
public class SpringBootStartApplication {
// @SpringBootApplication
// --> @Controller 찾기 위해서 SpringMVC component-scan
// servlet-context.xml에서 별도로 잡아줬음!
// --> Spring Boot에서는 @SpringBootApplication이라는 annotation이
// 달려져있는 클래스 파일의 ★하위 패키지★를 자동으로 scan
// 1. 서버가 내장되어있다.
// 2. application.properties 설정파일을 단순화
// 3. component-scan 기능을 자동으로 수행
// (반드시 start application보다 하위에 위치)
public static void main(String[] args) {
SpringApplication.run(SpringBootStartApplication.class, args);
}
}
Board.java => Entity
package com.smhrd.entity;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity // --> javax.persistence 사용하기!
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Board {
// JPA 필수요소 --> table의 자료를 담을 수 있는 나만의 자료형
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private int num;
private String title;
private String writer;
private String content;
private Date indate;
}
application.properties
# 3. JPA 설정
# NO SQL --> sql구문 만들 때 mysql 기반으로 sql 구문 만들어라
# (1) 어떤 DBMS 문법을 사용할 건지 --> 필수
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
# (2) DDL --> create, alter --> 의미 : 서버가 재시작 할 때마다 어떤 DDL 실행할건지
# Entity(VO) 기준으로 table 생성 : create
# Entity(VO) 기준으로 table 수정 : update
spring.jpa.hibernate.ddl-auto=update
# (3) 선택사항 : JPA가 만든 sql 구문 보여줘
spring.jpa.show-sql=true
# (4) 선택사항 : SQL구문 보여줄 때 예쁘게 보여줘
spring.jpa.properties.hibernate.format_sql=true
BoardController.java
package com.smhrd.controller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.smhrd.entity.Board;
import com.smhrd.repo.BoardRepository;
@Controller
public class BoardController {
@Autowired
private BoardRepository repo;
@RequestMapping("/")
public String getBoard() {
// 1. DB에서 데이터 조회하기
List<Board> list = repo.findAll();
// select * from board;
// 기본적인 CRUD 전부 메소드가 내장
// 복잡한 SQL 구문을 쓰고 싶으면 JPA 문법에 맞춰서 SQL 구문을 생성
// 2. 결과값을 model에 담아서 board.html에 보내주기
// SpringMVC --> WEB/INF/views/index.jsp --> index
// Springboot --> resources/templates/board.html --> board
return "board";
}
}
BoardRepository.java
package com.smhrd.repo;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.smhrd.entity.Board;
@Repository // --> scan가능하도록 annotation 달아줘야함!
// Spring은 버전업으로 @Mapper가 생략가능하지만,
// SpringBoot에서는 무조건 필수!
// 인터페이스 구현할 때 상속은 implements를 사용하지만
// Spring boot에서는 extends를 사용함.
// JPA 사용하기 위해서 필요한 것
// 1. table을 표현할 수 있는 자료형(Board)
// 2. Repository가 JPARepository를 상속받을 수 있게 제작
// --> JPARepository는 interface지만, 상속받을 때 extends 키워드를 쓰기로 약속
public interface BoardRepository extends JpaRepository<Board, Integer>{
// DAO역할, Mapper역할
// mybatis에서는 interface -mapping- xml : Mapper라는 이름 부여
// JPA에서는 xml이 없다! (NoSQL) --> Repository(DB/저장소)
// board테이블에서 작성자가 김운비와 같은 데이터를 조회
// --> 메소드 생성 --> JPA가 SQL 구문 생성
public List<Board> findBoardByWriter(String writer);
// --> select * from board where writer = '#{writer}'
// 규칙
// find + 테이블명 + By + 기준컬럼 + And(Or)
// --> 반드시 Camel식 기법 사용하기!
}
댓글