springboot
준비물
- Java : 8 / Eclipse 2020.6 or Java : 11 / Eclipse 2020.12
- DB : H2
- View Template : Thymeleaf
스프링부트 프로젝트 생성
- File > New > Spring Stater Project
프로젝트 생성시 설정 값
- Service URL : https://start.spring.io (변경하지 않음)
- Name : ex01
- Project : Gradle Project
- Type : Maven
- Packaging : War
- Java Version : 8
- Language : Java
- Group : com.springboot
- Artifact : ex01
- Version : 0.0.1-SNAPSHOT
- Description : Demo project for Spring Boot
- Package name : com.springboot.ex01
Next 버튼 클릭
- Spring Boot Version : 2.5.5
- Frequently Used
- Spring Boot DevTools
- Spring Web
- Thymeleaf
- Lombok
Finish 버튼 클릭
코드 실행
- src/main/java/com.springboot.ex01 > Ex01Application.java
- Run As > Spring Boot App
테스트 코드 실행
- @Test 코드를 JUnit 으로 실행
- src/test/java/com.springboot.ex01 > Ex01ApplicationTests.java
- Run As > JUnit Test
Controller 생성 및 실행
Controller 생성
- controller 패키지 추가
- @RestController로 데이터 전송
- @GetMapping로 Get 요청 처리
HelloController.java
package com.springboot.ex01.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello World";
}
}
실행 1
- 프로젝트 > Run As > Spring Boot App
- 브라우저 > localhost:8080/hello
실행 2
- 단독 실행가능한 war or jar 파일 생성
- 프로젝트 > Run As > Maven bulid > Goal : package , Profiles : 오류시 제거
- 프로젝트 > taraget > xxx-0.0.1-SNAPSHOT.war 생성됨
- cmd 창 > java -jar xxx-0.0.1-SNAPSHOT.war 실행
- 브라우저 > localhost:8080/hello
Spring Data JPA
- 사용 DB: DB
- Spring Boot DataBase 설정
- Spring Data JPA를 이용한 CRUD
- JpaRepository 인터페이스 활용
Spring Data JPA 용 프로젝트 생성
- Dependencies에 Spring Data JPA 추가 해서 생성
설정
- DB Driver pom.xml 추가
- src/main/resources/application.properties : DB 접속 관력 값 설정
설정 전 실행
- src/main/java/com.springboot.jpa01 > Jpa01Application.java
- Run As > Spring Boot App
- 오류 : JPA 관련 설정이 없기 때문
DB Driver 및 정보 설정
pom.xml
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
application.properties
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.username=sa
spring.datasource.password=
설정 후 실행
2021-10-18 16:19:23.864 INFO 13176 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2021-10-18 16:19:23.934 INFO 13176 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
ORM과 JPA
ORM (Object Relation Mapping)
- 객체지향 패러다임(Class)를 관계형 패러다임(Table)에 Mapping 해주는 개념
- ORM은 여러 프레임워크가 존재
JPA (Java Persistence API)
- Java 언어를 통해 데이터베이스같은 영속 계층(영구 저장)을 처리하는 스펙
- ORM을 Java 언어에 맞게 사용하는 스펙
- JPA 스펙을 구현한 프레임워크 중 Hibernate가 가장 유명
클래스와 테이블의 유사점
- 클래스의 인스턴스들은 테이블의 Row(레코드,튜플)과 유사
- 클래스는 데이터 + 행위, 테이블의 Row는 데이터만 저장
- 클래스는 참조, 테이블은 관계를 통해 서로 관계를 맺음
Stpring Data JPA - HIbernate
- HIbernate를 Spring Boot에서 사용할 수 있는 추가 API들 제공
Spring Data JPA <--> HIbernate <--> JDBC <--> DB
엔터티 객체와 JpaRepositoy
- 엔터티 객체 : JPA를 통해서 관리하게 되는 객체
- JpaRepositoy : 엔터티 객체를 처리하는 기능
간다한 Memo 기능 구현
엔터티 클래스 생성
어노테이션 설명
- @Entity : JPA로 관리되는 엔터티 클래스
- @Table : DB에 생성할 이름, @Entity와 함께 사용
- @Id : DB의 PK
- @GeneratedValue(strategy = GenerationType.IDENTITY) : 자동 입력 값
- @Column(length = 200, nullable = false) : 일반 컬럼 생성
strategy = GenerationType.IDENTITY 키 생성 전략
- AUTO : defualt, JPA 구현체(Hiberanate)에서 결정
- IDENTITY : 사용 DB에서 결정, mysql등은 auto imcrement
- SEQUENCE : Oracle, h2 DB의 sequence 이용, @SequenceGenerator와 함께 사용
- TABLE : 키생성 전용 테이블 생성, @TableGenerator와 함께 사용
Lombok 라이브러리 어노테이션
- @ToString : Object toSting 메서드 재정의
- @Getter : getter
- @Builder : Builder를 이용한 객체 생성 지원
- @AllArgsConstructor : @Builder를 위해 추가
- @NoArgsConstructor : @Builder를 위해 추가
Memo.java
package com.springboot.jpa01.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Entity
@Table(name="tbl_memo")
@ToString
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Memo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long mno;
@Column(length = 200, nullable = false)
private String memo;
}
application.properties 추가 설정
- spring.jpa.hibernate.ddl-auto : update
- create: 매번 테이블 생성 시동
- update : 없으면 create, 있으면 alter
- spring.jpa.properties.hibernate.format_sql=true : hibernate 처리 SQL 출력
- spring.jpa.show-sql=true : JAP 처리 SQL 출력
Console Info
Hibernate:
create table tbl_memo (
mno bigint generated by default as identity,
memo varchar(200) not null,
primary key (mno)
)