docker-compose에서 Java+Spring Boot+PostgreSQL(Spring Data JPA 편)
32195 단어 JavaPostgreSQLSpring Boottech
TL;DR
docker-compose.준비
cd your_project
mkdir server
touch docker-compose.yml
docker-compose.ymlversion: '3.6'
services:
app:
image: openjdk:15
container_name: app
ports:
- 8080:8080
tty: true
volumes:
- ./server:/srv:cached
working_dir: /srv
depends_on:
- db
adminer:
image: adminer:4.7.8
container_name: adminer
ports:
- "9000:8080"
depends_on:
- db
db:
image: postgres:13.1
container_name: db
environment:
POSTGRES_USER: "root"
POSTGRES_PASSWORD: "root"
POSTGRES_DB: "dev"
ports:
- "5432:5432"
volumes:
- dbvol:/var/lib/postgresql/data
- ./forDocker/db/initdb:/docker-entrypoint-initdb.d
volumes:
dbvol:
/docker-entrypoint-initdb.d
에 마운트된 ./forDocker/db/initdb
는 뒤에 서술할 것이다/docker-entrypoint-initdb.d
에 대해서는 Initialization scripts 페이지DB 초기 투입 쿼리 준비
postgres의 Docker 이미지는 위에서 설명한 Docker Hub 페이지에 나와 있습니다.
/docker-entrypoint-initdb.d
에 준비된 파일서비스가 시작되기 전에 실행됩니다.(MySQL의 Docker 이미지에도 같은 기능이 있나요)
생성
/var/lib/postgresql/data
시 이 검색을 실행하기 때문에다시 실행하고 싶을 때
이번
docker-compose.yml
이라면 docker volume를 분배했기 때문에dbvol
에서 삭제docker volume rm ...
하면 다시 실행할 수 있습니다.그렇다면 이 전제하에 DB의 초기 투입 조회를 준비하자.
mkdir -p forDocker/db/initdb
touch forDocker/db/initdb/1_create_users.sql
touch forDocker/db/initdb/2_insert_users.sql
touch forDocker/db/initdb/3_create_role_appuser.sql
forDocker/db/initdb/1_create_users.sqlCREATE TABLE users (
id SERIAL,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
forDocker/db/initdb/2_insert_users.sqlINSERT INTO users (
name
) values (
'test'
);
forDocker/db/initdb/3_create_role_appuser.sqlCREATE ROLE appuser WITH LOGIN PASSWORD 'apppass';
GRANT SELECT,UPDATE,INSERT,DELETE ON ALL TABLES IN SCHEMA public TO appuser;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO appuser;
파일 이름의 순서에 따라 실행하기 때문에 파일 이름에 서열을 분배합니다.3_create_role_appuser.sql에서 자바 프로그램에서 사용할 사용자를 만들었습니다.
표 작성 및 초기 데이터 INSERT에 투자하기 전에 사용자가
GRANT...ON ALL TABLES IN SCHEMA public TO...
이미 만든 양식에만 권한을 부여하는 것 같습니다이런 조회 순서입니다.
DB에 권한을 준다면 처음엔 괜찮았는데 이번엔 좀 꼬여서 사랑을 베는 거죠.
Gradle 프로젝트 만들기
이번에도 Spring Initializa라는 사이트에서 제작했습니다.
Dependencies에 PostgreSQL Driver와 Spring Data JPA를 추가하는 것을 잊지 마십시오.
Spring Boot에서 처리할 수 있는 ORM은 몇 가지 유형이 있습니다.
이번에 참고 기사로도 사용된 스프링 데이터 JPA.
입력이 끝나면 GENERATE가 다운로드됩니다.
다운로드 후 확장
your_프로젝트/서버 아래에 설정합니다.
server/src/main/java/com/example/api/ApiApplication.자바는 다운로드하면 됩니다.
server/src/main/java/com/example/api/ApiApplication.java
package com.example.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AppApplication {
public static void main(String[] args) {
SpringApplication.run(AppApplication.class, args);
}
}
server/src/main/resources/application.properties를 편집하면 다음과 같습니다.server/src/main/resources/application.properties
spring.datasource.url=jdbc:postgresql://db:5432/dev
spring.datasource.username=appuser
spring.datasource.password=apppass
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:postgresql://db:5432/dev
jdbc:postgresql://{DBコンテナ名}:{ポート}/{DB名}
spring.datasource.username=appuser
spring.datasource.password=apppass
Spring Data JPA 작성에 필요한 Enity 및 Repository
Spring Data JPA는 ORM이기 때문에.
Enity(테이블 매핑 대상) 및 Repository(DB 액세스 웨어하우스)만 만들면 됩니다.
DB Access를 사용할 수 있습니다.
# server/src/main/java/com/example/app までは Spring Initializr からDLしたものを展開した時点で存在するはずです
mkdir server/src/main/java/com/example/app/entity
touch server/src/main/java/com/example/app/entity/User.java
mkdir server/src/main/java/com/example/app/repository
touch server/src/main/java/com/example/app/repository/UserRepository.java
server/src/main/java/com/example/app/entity/User.javapackage com.example.app.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
protected User() {}
public User(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return String.format("{id:%d,name:%s}", id, name);
}
}
@GeneratedValue
는 DB의 설정과 연합하여 ID의 자동 번호를 설정하는 설정이다.자세한 내용은 아래와 같이 알기 쉽다.
forDocker/db/initdb/1_create_users.sql에서
users.id
SERIAL로 정의했죠.package com.example.app.repository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.example.app.entity.User;
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
}
UserRepository
이번에는 특별히 새로운 정의가 추가되지 않았습니다.CrudRepository
의 인터페이스를 직접 사용합니다.DI를 사용하여 User에 액세스하는 Controller 만들기
Spring의 강력한 DI를 사용하여 Controller를 준비합니다.
mkdir server/src/main/java/com/example/app/controller
touch server/src/main/java/com/example/app/controller/UserController.java
server/src/main/java/com/example/app/controller/UserController.javapackage com.example.app.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.app.repository.UserRepository;
@RestController
public class UserController {
private final UserRepository repository;
@Autowired
public UserController(UserRepository repository) {
this.repository = repository;
}
@RequestMapping("/")
public String user() {
return String.valueOf(repository.findAll());
}
}
@Autowired
Spring의 DI 기능을 추가하여 new와 깊이를 구현할 수 있습니다.이하 등은 이해하기 쉽다.
@RestController
와 @RequestMapping("/")
도 다음 기사에서 처리했다.이번에는 리스폰스가 스트링이다.
원래는 리포지토리를 다루는 Domain Model(Service)을 만드는 게 좋을 텐데 이번에는 그만두겠습니다.
Docker 용기를 시작하고Gradle 구축, 응용 시작, 요청
docker-compose up -d
# DB が立ち上がって初期化されるまでちょっとかかるのでちょっと待つ
docker-compose exec app bash
bash-4.4# sh gradlew build
...
BUILD SUCCESSFUL in 8m 41s
5 actionable tasks: 5 executed
# できてるのを確認
bash-4.4# ls build/libs/
app-0.0.1-SNAPSHOT.jar
bash-4.4# java -jar build/libs/app-0.0.1-SNAPSHOT.jar
시동 후 던지기 요청을 시도한다.$ curl http://localhost:8080 -X GET
[{id:1,name:test}]
그래!프로그램의 끝은 예에 따라 Ctrl + c입니다.
컨테이너에서 나오기
exit
, 컨테이너가 정지docker-compose down
.Adminer에서도 PostgreSQL에 연결하려고 시도합니다.
docker-compose.youl에 적힌 것처럼
http:localhost:9000
Adminer에 액세스할 수 있습니다.이렇게 하면 로그인할 수 있어요.
로그인 후 왼쪽의 "SQL 명령"을 통해 SQL 명령을 게시할 수 있습니다.
조회 결과를 이렇게 볼 수 있다.편리하고 빠르다!
이번 창고는 여기 있습니다.
참고 자료
Reference
이 문제에 관하여(docker-compose에서 Java+Spring Boot+PostgreSQL(Spring Data JPA 편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/junki555/articles/de2c9844a1d101텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)