본문 바로가기
개발 공부 Today I Learned

[국비 TIL] H2 Database, JPA

by 개발자신입 2024. 4. 30.
반응형

H2 Database

3가지 모드

  • Embedded : 스프링과 같이 구동
  • Server : Tcp통신으로 접속할 수 있게 하는 모드
  • In-Memory : 데이터를 메모리에 저장하는 방식, 서버를 끄면 사라짐 (휘발성)

 

 

 

 

application.properties

spring.application.name=H2_jpa

#port
server.port=80

# H2 (mem=메모리모드, 끄면 사라짐)
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

# spring.jpa.hibernate.ddl-auto 설정
# none - 엔티티가변경되더라도데이터베이스를변경하지않음
# update - 엔티티의변경된부분만적용
# validate - 변경사항검사만진행
# create - 서버가실행시모두삭제하고데이터다시생성
# create-drop - create와동일하지만종료시에도모두삭제
spring.jpa.hibernate.ddl-auto=update

# 콘솔에서실행된쿼리확인(테스트용)
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.show_sql=true

# thymeleaf 참조경로
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

# 리소스변화를반영.
spring.devtools.livereload.enabled=true

 

실행시켜보기

데이터베이스가 없어도 접속 가능 http://localhost/h2-console

 

Board

import LocalDateTime;
import Column;
import Entity;
import GeneratedValue;
import Id;
import Builder;
import Data;
import NoArgsConstructor;

@Data
@Entity
@NoArgsConstructor
public class Board {

    @Id
    @GeneratedValue
    private int bno;
    
    @Column(length=50)
    private String btitle;
    
    @Column(columnDefinition = "mediumtext")
    private String bcontent;
    
    @Column
    private LocalDateTime bdate = LocalDateTime.now();
    
    @Column(nullable = false)
    private String name;
    
    @Builder
    public Board(String btitle, String bcontent, String name) {
        this.btitle = btitle;
        this.bcontent = bcontent;
        this.name = name;
    }
}

 

=> 구동

\

=> 이렇게 생성해준다. 

 

H2Controller

import LocalDateTime;
import Controller;
import GetMapping;

@Controller
public class H2Controller {
    @GetMapping("/insert")
    public String insert() {
        Board board = new Board("연습1", "본문1", "작성자1");
        board.setBdate(LocalDateTime.now());
        return "";
    }
}

 

-> 서비스 생성 후, 컨트롤러에 서비스 연결

@Controller
public class H2Controller {

    @Autowired
    private H2Service h2Service;
    
    @GetMapping("/insert")
    public String insert() {
        Board board = new Board("연습1", "본문1", "작성자1");
        board.setBdate(LocalDateTime.now());
        h2Service.insert(board);
        return "redirect:/board";
    }
}

 

-> insert 를 서비스에 생성

-> BoardRepository 생성 (인터페이스)

 

BoardRepository (인터페이스)

인터페이스로 생성하기 > JpaRepository를 추가

 

import org.springframework.data.jpa.repository.JpaRepository;

	public interface BoardRepository extends JpaRepository<Board, Integer> {
}

 

 

H2Service.java

@Service
public class H2Service {

    @Autowired
    private BoardRepository boardRepository;
    
    public void insert(Board board) {
    	boardRepository.save(board);
    }
}

 

-> localhost/insert 로 접속

-> 500에러가 나는데 이거는 타임리프가 없어서 나는거라서 상 관없음.

-> 다시 localhost/h2-console로 접속해서 [SELECT * FROM BOARD] 실행시키면

 

H2Controller

@GetMapping("/board")
public String board(Model model) {
    model.addAttribute("list", h2Service.findAll());
    return "board";
}

 

-> findAll() 을 서비스에 생성

 

H2Service

public List<Board> findAll() {
	return boardRepository.findAll();
}

 

board.html

<!DOCTYPE html>
<html lang="ko" th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>board</h1>
    <table>
        <tr>
            <th>번호</th>
            <th>제목</th>
            <th>날짜</th>
            <th>작성자</th>
        </tr>
            <tr each="row : ${list }">
            <td text="${row.bno }"></td>
            <td text="${row.btitle }"></td>
            <td text="${row.bdate }"></td>
            <td text="${row.name }"></td>
        </tr>
	</table>
</body>
</html>

 

=> localhost/insert로 접속 시, board로 넘어감

 

반응형

댓글