docker-compose에서 Java+Spring Boot+PostgreSQL(Spring Data JPA 편)

제목의 글자 수가 얼마 안 돼서 한계에 다다랐는데...

TL;DR

  • 아래 글에서 기술한 바와 같이 (+설정을 조금 바꾸세요)
  • 샘플 코드도 마찬가지
  • docker-compose에서 SpringBoot과 PostgreSQL의 개발 환경을 준비합니다!위 | Qiita
  • https://qiita.com/gosutesu/items/d2fe4811f4290ad01c4b
  • SpringBoot과 PostgreSQL의 개발 환경은 docker-compose에서만 준비합니다!아래 | Qiita
  • https://qiita.com/gosutesu/items/f45150cbde3f035c54dd
  • docker-compose.준비


    cd your_project
    mkdir server
    touch docker-compose.yml
    
    docker-compose.yml
    version: '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:
    
  • OpenJDK | DockerHub
  • https://hub.docker.com/_/openjdk
  • JDK Project Releases | OpenJDK
  • 지정할 수 있는 버전 정보는 여기
  • http://openjdk.java.net/projects/jdk/
  • postgres | DockerHub
  • /docker-entrypoint-initdb.d에 마운트된 ./forDocker/db/initdb는 뒤에 서술할 것이다
  • /docker-entrypoint-initdb.d에 대해서는 Initialization scripts 페이지
  • 를 참조하십시오.
  • https://hub.docker.com/_/postgres
  • Adminer | DockerHub
  • PostgreSQL에 대응하는 PHP제 GUI SQL 클라이언트
  • https://hub.docker.com/_/adminer
  • 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.sql
    CREATE TABLE users (
      id SERIAL,
      name VARCHAR(255) NOT NULL,
      PRIMARY KEY (id)
    );
    
    forDocker/db/initdb/2_insert_users.sql
    INSERT INTO users (
      name
    ) values ( 
      'test'
    );
    
    forDocker/db/initdb/3_create_role_appuser.sql
    CREATE 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라는 사이트에서 제작했습니다.
  • Spring Initializr
  • https://start.spring.io/

  • Dependencies에 PostgreSQL Driver와 Spring Data JPA를 추가하는 것을 잊지 마십시오.
    Spring Boot에서 처리할 수 있는 ORM은 몇 가지 유형이 있습니다.
    이번에 참고 기사로도 사용된 스프링 데이터 JPA.
  • Java OR 맵의 점 선택 | SlideShare
  • https://www.slideshare.net/masatoshitada7/java-or-jsug
  • 잡담은 그만두어라.
    입력이 끝나면 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
  • Docker로 액세스한 경우jdbc:postgresql://{DBコンテナ名}:{ポート}/{DB名}
  • DB 이름은 docker-compose입니다.yml를 dev로 사용
  • spring.datasource.username=appuser
  • spring.datasource.password=apppass
  • forDocker/db/initdb/3_create_role_appuser.sql로 준비한 사용자
  • 기타 옵션은 아래 내용을 참조하십시오.
  • Spring Boot 적용 속성 설정 요약 - spring 참조
  • https://spring.pleiades.io/spring-boot/docs/current/reference/html/appendix-application-properties.html
  • 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.java
    package 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로 정의했죠.
  • @Generated Value를 사용하여 키를 생성하는 방법|Qita
  • https://qiita.com/KevinFQ/items/a6d92ec7b32911e50ffe
  • server/src/main/java/com/example/app/repository/UserRepository.java
    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.java
    package 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와 깊이를 구현할 수 있습니다.
    이하 등은 이해하기 쉽다.
  • [Spring] @Autowired와 @Component의 DI의 기본 | 나가사키 하우스의 기술 노트
  • https://www.shookuro.com/entry/2016/08/09/175801
  • @RestController@RequestMapping("/")도 다음 기사에서 처리했다.
    이번에는 리스폰스가 스트링이다.
    원래는 리포지토리를 다루는 Domain Model(Service)을 만드는 게 좋을 텐데 이번에는 그만두겠습니다.
  • docker-compose에서 Java+Spring Boot+간단한 웹 API 만들기 | 북산순도|zen
  • https://zenn.dev/junki555/articles/a19f27d1045805
  • 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 명령을 게시할 수 있습니다.
    조회 결과를 이렇게 볼 수 있다.편리하고 빠르다!

    이번 창고는 여기 있습니다.
    https://github.com/JUNKI555/java_spring_boot_practice02

    참고 자료

  • docker-compose에서 SpringBoot과 PostgreSQL의 개발 환경을 준비합니다!위 | Qiita
  • https://qiita.com/gosutesu/items/d2fe4811f4290ad01c4b
  • SpringBoot과 PostgreSQL의 개발 환경은 docker-compose에서만 준비합니다!아래 | Qiita
  • https://qiita.com/gosutesu/items/f45150cbde3f035c54dd
  • VScode와 Docker를 통해 Spring Boot+PostgreSQL 개발 환경 만들기 (1) | Sales8 개발자 일기
  • https://ameblo.jp/kazusa-g/entry-12535018096.html
  • VScode와 Docker를 통해 Spring Boot+PostgreSQL 개발 환경 만들기(2) | Sales8 개발자 일기
  • https://ameblo.jp/kazusa-g/entry-12536838291.html
  • SpringBoot 시작하기 위한 안내서(수시로 업데이트)|Qita
  • https://qiita.com/sugaryo/items/5695bfcc21365f429767
  • Spring Data JPA에 대한 입문 시도
  • https://qiita.com/shukawam/items/6e379df031dccebddd36
  • Spring Bootwith Docker의 개발 환경 고려
  • https://blog.tiqwab.com/2017/03/21/docker-java.html
  • [Spring Boot 입문(5)] RestAPI(POST) | 낚시 키치 엔지니어의 블로그 만들기
  • https://poppingcarp.com/spring-boot_intro_rest_post/
  • Spring MVC 컨트롤러의 다양한 반환값 |Qita
  • https://qiita.com/tag1216/items/3680b92cf96eb5a170f0
  • 좋은 웹페이지 즐겨찾기