Backend
home
🧪

Spring Webflux 활용하여 postgresql로 CRUD 되는지 테스트

생성 일시
2025/08/01 05:57
태그
SpringBoot
게시일
2025/08/01
최종 편집 일시
2025/08/02 05:37

Docker 에서 설치

1. docker 버전 확인

docker --version
Bash
복사

2. docker run - postgresql install

docker run --name postgres17 \ -e POSTGRES_USER=admin \ -e POSTGRES_PASSWORD=admin1234 \ -e POSTGRES_DB=testdb \ -p 5432:5432 \ -d postgres:17
Shell
복사
-name postgres17: 컨테이너 이름
e POSTGRES_USER=admin: 사용자 이름
e POSTGRES_PASSWORD=admin1234: 비밀번호
e POSTGRES_DB=testdb: 초기 생성할 DB
p 5432:5432: 포트 매핑
d postgres:17: PostgreSQL 17 버전 이미지

로컬 환경에서 설치 + SpringBoot Setting

PostgreSQL 설치 후 접속 (터미널)
psql -d postgres -h localhost
Shell
복사
데이터베이스 및 유저 / Role 생성
CREATE USER 사용자이름 WITH PASSWORD '비밀번호';
SQL
복사
권한 부여
# 데이터베이스 생성 권한 ALTER USER myuser CREATEDB; # 로그인 허용 (기본은 허용됨) ALTER ROLE myuser LOGIN; # 슈퍼유저 권한 (모든 권한) ⚠️ 보안상 일반 사용자에게는 권장하지 않습니다. ALTER USER myuser WITH SUPERUSER; # 특정 데이터베이스에 권한 부여 CREATE DATABASE mydb OWNER myuser; # 기존 데이터베이스 접근 권한 부여 GRANT CONNECT ON DATABASE mydb TO myuser; # 테이블/스키마 사용 권한 설정 GRANT USAGE ON SCHEMA public TO myuser; # 모든 테이블 SELECT/INSERT/UPDATE/DELETE 권한 GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO myuser; # 앞으로 생길 테이블에 대해서도 자동 권한 부여 ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO myuser; # 권한 확인 \du # 특정 사용자 권한 확인 \du myuser
SQL
복사
build.gradle 설정
dependencies { // WebFlux 스타터 implementation 'org.springframework.boot:spring-boot-starter-webflux' // R2DBC를 사용할 경우 implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc' // R2DBC PostgreSQL 드라이버 (PostgreSQL 17 호환 가능) implementation 'org.postgresql:r2dbc-postgresql:1.0.7.RELEASE' // 기존 JUnit 설정 testRuntimeOnly 'org.junit.platform:junit-platform-launcher' // 테스트 testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.projectreactor:reactor-test' }
Shell
복사
application-properties
spring.r2dbc.url=r2dbc:postgresql://localhost:5432/testdb spring.r2dbc.username=사용자이름 spring.r2dbc.password=비밀번호입력 spring.sql.init.mode=never spring.sql.init.platform=postgres logging.level.org.springframework.r2dbc=DEBUG
Shell
복사

SpringBoot 폴더 구조 및 코드 내용

. ├── HELP.md ├── README.md ├── build │ ├── classes │ │ └── java │ │ └── main │ │ └── org │ │ └── com │ │ └── dungeonpoc │ │ └── DungeonPocApplication.class │ ├── generated │ │ └── sources │ │ ├── annotationProcessor │ │ │ └── java │ │ │ └── main │ │ └── headers │ │ └── java │ │ └── main │ ├── resources │ │ └── main │ │ └── application.properties │ └── tmp │ └── compileJava │ └── previous-compilation-data.bin ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── out │ └── production │ ├── classes │ │ └── org │ │ └── com │ │ └── dungeonpoc │ │ ├── DungeonPocApplication.class │ │ ├── controller │ │ │ └── BookController.class │ │ ├── domain │ │ │ └── Book.class │ │ ├── repository │ │ │ └── BookRepository.class │ │ └── service │ │ └── BookService.class │ └── resources │ ├── db │ │ └── migration │ │ └── schema.sql │ └── application.properties ├── settings.gradle └── src ├── main │ ├── generated │ ├── java │ │ └── org │ │ └── com │ │ └── dungeonpoc │ │ ├── DungeonPocApplication.java │ │ ├── controller │ │ │ └── BookController.java │ │ ├── domain │ │ │ └── Book.java │ │ ├── repository │ │ │ └── BookRepository.java │ │ └── service │ │ └── BookService.java │ └── resources │ ├── db │ │ └── migration │ │ └── schema.sql │ └── application.properties └── test └── java └── org └── com └── dungeonpoc └── DungeonPocApplicationTests.java
Shell
복사
controller
package org.com.dungeonpoc.domain; import lombok.Getter; import lombok.Setter; import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Table; @Table("books") @Getter @Setter public class Book { @Id private Long id; private String title; private String author; // Constructors, Getters, Setters public Book() {} public Book(String title, String author) { this.title = title; this.author = author; } }
Java
복사
domain
package org.com.dungeonpoc.domain; import lombok.Getter; import lombok.Setter; import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Table; @Table("books") @Getter @Setter public class Book { @Id private Long id; private String title; private String author; // Constructors, Getters, Setters public Book() {} public Book(String title, String author) { this.title = title; this.author = author; } }
Java
복사
repository
package org.com.dungeonpoc.repository; import org.com.dungeonpoc.domain.Book; import org.springframework.data.repository.reactive.ReactiveCrudRepository; import org.springframework.stereotype.Repository; @Repository public interface BookRepository extends ReactiveCrudRepository<Book, Long> { }
Java
복사
service
package org.com.dungeonpoc.service; import lombok.RequiredArgsConstructor; import org.com.dungeonpoc.domain.Book; import org.com.dungeonpoc.repository.BookRepository; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @Service @RequiredArgsConstructor public class BookService { private final BookRepository bookRepository; public Flux<Book> getAll() { return bookRepository.findAll(); } public Mono<Book> getById(Long id) { return bookRepository.findById(id); } public Mono<Book> create(Book book) { return bookRepository.save(book); } public Mono<Book> update(Long id, Book book) { return bookRepository.findById(id) .flatMap(existing -> { existing.setTitle(book.getTitle()); existing.setAuthor(book.getAuthor()); return bookRepository.save(existing); }); } public Mono<Void> delete(Long id) { return bookRepository.deleteById(id); } }
Java
복사
테스트
터미널에서 테이블 내역 확인
psql (PostgreSQL) 17.5 (Homebrew) ~ psql -U admin -d testdb ✔ psql (17.5 (Homebrew)) 도움말을 보려면 "help"를 입력하십시오. testdb=# show tables; ERROR: unrecognized configuration parameter "tables" testdb=# select * from books; id | title | author ----+--------------+------------------- 1 | 테스트 | 민성 4 | 테스트4 | 민성4 3 | 테스트2 수정 | 민성2 수정합니다. (3개 행)
Shell
복사

PgAdmin 활용 (PostgreSQL 설치 이후 - 필자는 Mac 기준으로 진행)

윈도우 설치링크: https://www.postgresql.org/ftp/pgadmin/pgadmin4/v9.6/windows/
윈도우 설치 관련 참고링크 - 두 링크 참고해서 진행하면 될 듯
설치 진행
접속 후 확인
단축키 변경 (Preference > Keyboard > Query Tool)
수정 후 디스크 버튼(저장) 클릭