본문 바로가기

MySQL9

Docker compose를 통한 Nginx, Spring boot, React, Mysql 연동 및 배포 서론 최근 프로젝트에서 도커를 통해 Spring boot와 React 프로젝트를 진행하면서 리버스 프록시 역할을 수행하는 Nginx를 같이 실행해 보았다. 추가로 Mysql까지 실행하며 모든 컨테이너는 Docker compose에 의해 실행될 수 있도록 구현하였다. Spring boot는 비즈니스 로직을 처리하며 Mysql과 연동하여 데이터를 저장, 처리, 조회하는 기능을 담당한다. React는 사용자와 상호작용하는 부분으로 Nginx 서버를 통해 구동되며, Nginx 서버는 사용자 요청을 url에 따라 Spring boot로 보낼지, React로 보낼지 정하는 리버스 프록시 역할을 수행한다. 이 글에서는 docker-compose를 통해 각 서비스를 배포한 과정을 기록한 것이다. 본론 우선 실행을 위한.. 2024. 4. 7.
프로젝트 일지 - 쿼리 통합: 여러 번의 db접근을 감소시키자(with springboot, mysql, mybatis) 들어가기 현재 진행하는 프로젝트는 지도 위에 게시 글을 작성하는 웹 사이트이다. 게시글 페이지에 접근 시 위도, 경도의 정보와 게시글이 가지는 기본적인 정보 및 좋아요, 댓글, 댓글 좋아요 등 정보들을 확인할 수 있도록 하였다. 사용자가 게시글 페이지에 접근 시, 프론트 서버에서는 백엔드에 한번 접근 시 위 정보들을 모두 얻지만, 백엔드 서버에서 DB에 접근하는 횟수는 4번이다. DB 접근할 때마다 얻는 내용은 아래와 같다. 게시글 상세 정보 조회 게시글에 회원이 좋아요를 눌렀는지 조회 게시글에 달린 댓글 리스트 조회 댓글마다 회원이 좋아요를 눌렀는지 조회 게시글 페이지를 들어갈 시, 위 4번의 DB에 접근하는 메서드가 실행된다. 서버는 DB에 접근하는 경우에 비용이 발생하므로 최적화를 위해선 DB 접근.. 2023. 12. 25.
springboot(jpa, mybatis) - page 객체 및 커버링 인덱스를 사용해보자! 들어가기 평소 프로젝트를 진행할 때는 페이지 처리를 할 때, 페이지 처리 로직이나 객체를 직접 만들어서 사용했었다. 하지만 최근 Page 객체라는 것이 있고 spring에서 제공하고 있다는 것을 알았다. Page 객체를 사용하면 다음페이지가 있는지, 전체 사이즈가 몇인지, 이전 페이지가 있는지 등 구현하기 귀찮은 여러 메서드들을 제공해 주니 유용하게 사용된다고 한다. 페이지 처리를 하는데 있어 Page 객체를 사용 안 해볼 수는 없기에 직접 사용해 보기로 하였다. 이 글은 페이지 객체를 사용한 경험담을 담고있다. 처음에는 Page 객체니, PageRequest 니 Pagable이니 PageImpl 등 뭔 Page 하나에 관련된 객체가 너무 많아서 어디서부터 접근해야 할지 막막했었다. page처리를 위해 .. 2023. 8. 24.
스프링부트 With Mysql - easyRandom을 통한 bulk Insert 및 Index 적용 이 글은 개인적인 생각을 작성한 것이다. 들어가기 데이터베이스에 대해 공부하다 보면 마주치는 것 중 인덱스라는 것을 들어보았을 것이다. 필자 또한 인덱스라는 개념을 책 및 인터넷을 통해 많이 접하았다. 쿼리 최적화에 대해 공부하면서 인덱스 또한 공부도 하였다. 하지만 인덱스를 통해 충분한 성능을 보기 위해서는 충분한 데이터가 있어야 한다고 들었다. 그래서 데이터가 많지 않으니까 다음에 적용하자~! 라는 핑계로 계속 인덱스를 직접 적용해 보는 것을 미뤘었다. 그러던 중 최근에 EasyRandom을 통한 랜덤한 객체를 수백만 건을 생성해 주는 방법을 접하게 되었다. 지금까지 진행하던 테스트에서는 일일이 값을 집어넣어서 객체를 생성하고 테스트를 진행하였다. EasyRandom은 이런 나에게 매우 매혹적으로 보.. 2023. 8. 3.
mybatis - ResultMap Collection을 통해 데이터 한번에 가져오기 프로젝트를 진행하던 중 member의 정보와 member가 작성한 article의 리스트, member가 속해 있는 group의 리스트를 가져와야 하는 기능을 구현해야 했다. member와 article와 group는 각각 테이블이고 member와 article는 일대다 관계, member와 group는 다대다 관계이며 중간에 member_group이라는 연결 테이블이 존재한다. member 정보 따로, article 리스트 따로, group 리스트 따로 구현하면 3번의 db접근이 일어난다. 그리고 설계를 잘못하면 N+1문제가 발생할 수 있다. 나는 이를 1번의 DB접근으로 표현하고 싶다. JPA에서는 fetch join 혹은 eager 한 방식으로 데이터를 가져오거나 배치사이즈를 조정하여 문제를 해결할.. 2023. 6. 18.
Gradle, 도커(docker)를 통한 springboot3 with mysql 배포(docker-compose) build.gradle 에 도커 관련 추가 부분 plugins { id 'java' id 'org.springframework.boot' version '3.2.3' id 'io.spring.dependency-management' version '1.1.4' id 'com.palantir.docker' version '0.35.0' } ... docker { println(tasks.bootJar.outputs.files) name rootProject.name + ":" + version dockerfile file('Dockerfile') files tasks.bootJar.outputs.files buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singl.. 2023. 5. 7.
AWS RDS를 통한 관계형 데이터베이스 구축 및 springboot 연동 들어가기 프로젝트를 진행함에 있어서 가장 중요한 것 중 하나는 데이터베이스이다. 간단히 로컬에서 프로젝트를 진행할 때는 h2를 사용하였고 배포까지 진행할 때는 배포서버 내부에 mariaDB를 설치하여 데이터를 삽입하였다. 그렇다면 aws 프리티어를 사용하고 있을 때는 어떻게할까? 프리티어로 진행한 서버는 내부 용량이 적기 때문에 데이터베이스 크기도 작을 수 밖에 없고 한눈에 데이터들을 파악하기도 힘들다. 그리고 배포 서버에 문제가 생기면 데이터베이스에 접근할 수 없다는 문제도 있다. 이럴때 유용한 것이 aws rds이다. aws rds는 aws에서 rds 전용 서버를 제공을 해주는 서비스이다. 즉, 배포서버에서 데이터를 rds 서버로 저장을 시켜서 데이터를 굳이 배포서버에 저장할 필요가 없어진다. 배포서.. 2023. 2. 22.
스프링부트 MyBatis를 이용하여 MySQL 연동 및 동적쿼리 개발자들은 데이터 베이스에 데이터를 유지하기 위해 JDBC를 이용하여 데이터베이스에 접근하였다. JDBC의 복잡함을 단순하게 하게 위해 Persistence FrameWork를 사용했는데 ORM 프레임워크와 SQL 매퍼이다. ORM 프레임워크는 SQL 코드를 직접 작성하지 않고 자바에서 객체지향적인 방식으로 데이터를 객체로 다루면 이를 관계형 데이터베이스에서 작업할 때 SQL로 변환하여 연동을 할 수 있도록 하는 것이다. 즉 SQL을 직접 작성할 필요가 없는 것이다. 데이터베이스에 종속성이 약해서 바뀌더라도 바로바로 적용 가능하다. 대표적으로는 Hibernate가 있고 이에 대한 표준 기술 명세가 JPA이다. MyBatis는 ORM 프레임워크라고 말하지는 않고 SQL 매퍼라고 한다. 객체와 관계형 데이터.. 2022. 2. 25.
JPA column에 list를 넣는 방법(String 변환, @ElementCollection) 들어가기 Springboot와 JPA를 통해 프로젝트를 진행하던 중 간단한 값들의 리스트를 하나의 엔티티에 넣어두고 싶을 때가 있었다. 이는 '@OneToMany'를 통해서 새로운 테이블과 연관관계를 맺으면 쉽게 구현할 수 있지만... 새로운 테이블을 만들고 조인을 하는 등 복잡한 방법을 쓰고 싶지가 않았다. 오직 원하는 테이블만을 위한 리스트 필드를 가지고 싶은 것이다. 이럴 때 어떻게 사용할 수 있을까? 이 글에서는 간단하게 1. String으로의 변환 2. @ElementCollection 두가지 방법으로 소개하려고 한다. 본론 1. String 타입으로 변환 첫번째로 리스트를 Stirng 타입으로 변환하여 저장하는 것이다. 아래의 사진을 봐보자. 위는 특정 요청을 했을 때 응답 값을 JSON 형식.. 2021. 12. 11.