JPA + Spring Boot + AWS RDS (MySQL Engine) 세팅

ssook·2023년 9월 12일
3
post-thumbnail

📍 현재 백엔드에서 사용하고 있는 기술스택

  • JPA + Spring Boot + AWS RDS + MySQL
    • JPA JPA(Java Persistence API)는 자바 어플리케이션에서 관계형 데이터베이스와 상호 작용하기 위한 자바 ORM(Object-Relational Mapping)임. JPA는 객체 지향 프로그래밍 언어인 자바와 관계형 데이터베이스 간의 불일치를 해결하고, 데이터베이스와의 상호 작용을 더 쉽고 효율적으로 만들어 줌.
      • JPA의 주요 개념과 기능
        1. Entity 클래스: JPA를 사용하려면 먼저 엔터티 클래스를 정의. 엔터티 클래스 = 데이터베이스 테이블과 매핑되는 자바 객체
        2. EntityManager: EntityManager는 JPA의 핵심 인터페이스로, 엔터티 객체의 생명주기를 관리하고 데이터베이스와의 통신을 처리. EntityManager를 사용하여 엔터티를 저장, 검색, 수정, 삭제 가능.

        3. Entity 매핑: 엔터티 클래스와 데이터베이스 테이블 간의 매핑 지원.
        어노테이션(@) 또는 XML 설정을 사용해 엔터티 필드와 데이터베이스 컬럼 매핑.

        4. JPQL(Java Persistence Query Language): JPQL은 엔터티를 검색하기 위한 객체 지향 쿼리 언어로,
        SQL과 유사하지만 엔터티와 필드에 대한 쿼리를 작성할 때 객체 모델을 기반으로 함.

        5. 트랜잭션 관리: JPA는 데이터베이스 작업을 트랜잭션 내에서 수행하도록 지원함. 이를 통해 데이터 일관성과 무결성을 보장할 수 있음.
        6. 캐싱: JPA는 엔터티 캐싱을 지원하며 데이터베이스 접근 횟수를 최소화하고 성능을 향상시킬 수 있음.
        7. 관계 매핑: JPA는 엔터티 간의 관계를 매핑할 수 있으며, 단방향 및 양방향 관계를 지원함.
        8. 생명주기 관리: JPA는 엔터티의 생명주기를 관리하며, 엔터티를 영속화, 분리(detach), 병합(merge), 삭제할 수 있음.

        그냥 데이터베이스와 상호 작용할 때 쓰는 툴이라고 보면 됨.

    • AWS RDS AWS RDS (Amazon Relational Database Service) = 클라우드에서 관계형 데이터베이스를 쉽게 구축, 운영 및 확장할 수 있는 완전 관리형 데이터베이스 서비스.
      1. 다양한 데이터베이스 엔진: AWS RDS는 여러 가지 관계형 데이터베이스 엔진을 지원함.

        이 엔진에는 MySQL, PostgreSQL, Oracle, Microsoft SQL Server, MariaDB 등이 포함됨.

        개발자는 자신의 애플리케이션 요구에 맞는 데이터베이스 엔진을 선택할 수 있음. (우리는 지금 MySQL!)

      2. 관리 및 유지보수 간소화: RDS는 데이터베이스의 관리 작업을 자동화하므로 데이터베이스 관리자(DBA)가 데이터베이스를 관리하고 유지보수하기 쉬움.

        이러한 작업에는 백업, 패치 및 업그레이드, 모니터링 및 자동 복구가 포함됨.

      3. 보안: RDS는 데이터베이스 보안을 강화하기 위한 다양한 기능을 제공함. VPC (Virtual Private Cloud) 내에서 실행되며, 암호화, 네트워크 액세스 제어, IAM(Identity and Access Management) 기반의 권한 관리 등을 통해 데이터 보호를 강화함.

      4. 확장성: RDS는 데이터베이스 인스턴스의 크기를 조절하거나 다중 AZ (Availability Zone) 배포를 통해 가용성을 높이는 등의 확장성 옵션을 제공함.

        이를 통해 애플리케이션이 트래픽이 증가하거나 성능이 필요할 때 데이터베이스를 쉽게 확장할 수 있음.

      5. 자동 백업과 복구: RDS는 자동 백업을 지원하며, 데이터베이스의 상태를 원하는 시점으로 복구할 수 있음.

        또한 다중 AZ 설정을 통해 고가용성을 확보하고 장애 시 자동 장애 복구를 제공함.

      6. 모니터링 및 경고: AWS CloudWatch와 통합하여 데이터베이스의 성능 및 상태를 실시간으로 모니터링하고, 사용자가 정의한 경고 및 알림을 설정할 수 있음.

      7. 배포 옵션: RDS는 단일 AZ 또는 다중 AZ 구성으로 배포할 수 있음. 다중 AZ는 고가용성을 향상시키는데 도움이 되며, 자동 장애 복구를 제공함.


    • MySQL MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS)으로, 데이터를 효율적으로 저장, 관리, 검색 및 조작할 수 있는 솔루션임. MySQL은 웹 애플리케이션, 서버 애플리케이션, 모바일 애플리케이션 등 다양한 응용 프로그램에서 데이터 저장 및 관리에 널리 사용되며, 오픈 소스 커뮤니티와 기업에서 지원하고 있어 안정적인 데이터베이스 솔루션으로 인기가 있음.
    • Spring Boot
      • Spring Boot는 자바 기반의 웹 애플리케이션을 빠르게 개발하기 위한 프레임워크로, 설정을 최소화하고 기본 기능을 제공하여 개발 생산성을 높임. Spring Boot는 내장된 웹 서버로 애플리케이션을 쉽게 실행할 수 있으며, 스프링 생태계와의 통합을 간편하게 지원함. 스프링과 스프링 부트의 주요 차이점은 아래와 같음.
        1. 설정의 양: 스프링은 상당한 수의 XML 또는 Java 기반 설정이 필요할 수 있으며,

          개발자가 애플리케이션의 구성과 설정을 자세히 다루어야 함.

          반면, 스프링 부트는 자동 구성을 통해 설정을 최소화하고 개발자가 빠르게 애플리케이션을 시작할 수 있음.

        2. 내장된 웹 서버: 스프링 부트는 내장된 웹 서버(예: Tomcat, Jetty, Undertow)를 제공하여 애플리케이션을 실행하는 데 필요한 서버 구성을 간소화함.

          스프링에서는 외부 웹 서버를 설정하고 배포하는 작업이 더 필요함.

        3. 의존성 관리: 스프링 부트는 "Starter" 패키지를 제공하여 특정 기술 스택을 사용하는 데 필요한 의존성을 쉽게 추가할 수 있게 함.

          이로써 개발자는 많은 의존성을 수동으로 관리하지 않아도 됨.

        4. 편의성: 스프링 부트는 기본 설정과 관례를 따라 개발자에게 편의성을 제공합니다.

          예를 들어, 클래스 패스에 JAR 파일을 추가하면 자동으로 설정되며, 개발 서버를 실행하면 자동으로 애플리케이션이 시작됨.

        요약하면, 스프링은 더 많은 커스터마이징과 설정을 요구하며, 더 많은 작업을 개발자에게 위임함. 반면, 스프링 부트는 개발자가 설정의 부담을 덜고, 보다 빠르게 애플리케이션을 구축하고 실행할 수 있음.

📍 AWS RDS 생성

  1. AWS 콘솔로 접속한다.

    ( 당연히 ! 계정이 필요하다.)

  2. 콘솔에 접속한 이후 RDS 서비스로 이동한다.
    안 보이면 AWS 서비스 중 검색해서 찾으면 됨.

  3. 제일 위에 있는 데이터 베이스 생성을 누른다.

  4. 지금부터는 프리티어 세팅이므로, 자신이 고가용성이나 프로덕션, 좀 더 좋은 사양의 클라우드 DB를 만들고 싶다면 알아서 세팅해서 만들자.

    • 데이터베이스 생성 방식 : 표준 생성

    • 엔진 유형 : MySQL (우리는 사이드 프로젝트에서 MySQL을 쓰므로 이걸로 세팅)

    • 템플릿 : 프리 티어

      → 다른 건 왕 비싸다. 본인이 재벌이거나 다른 데서 후원 받지 않는 이상 잘 안 쓸 듯

    • 설정

      • DB 인스턴스 식별자 : 그냥 디폴트로 해도 상관없음. 다만, 추후 RDS에서 DB 만들 때 지금 만든 거랑 식별자 같게 못하므로 그것만 주의하면 됨.

      • 자격 증명 설정

        • 마스터 사용자 이름 : DB에 접속할 때 사용하는 마스터 사용자 ID. 이 아이는 자기가 원하는 대로 잘 지어주자.

        • 마스터 암호 : DB 접근 시 필요한 암호, 추후 바꿀 수 있다만은 그래도 잘 기억해두자. 저 위의 사용자 이름과 암호는 알아야 DB에 접근 가능하다.

      • 인스턴스 구성과 스토리지는 프리티어여서 별 세팅을 할 필요가 없음.

      • 연결

        • EC2 컴퓨팅 리소스에 연결 안 함. → 사실 이건 프로젝트 세팅마다 다르다. 본인이 지금 EC2 컴퓨팅 리소스에서 바로 RDS 접근하고 싶다면 연결로 체크해줘야 한다.
      • 퍼블릭 엑세스

        ‘예’로 해야 접근 가능함.

        아니요하면 해당 RDS가 속한 VPC 내부의 리소스만 DB 접근이 가능하므로

        당신이 만든 애플리케이션이 해당 RDS가 속한 VPC 리소스에 있지 않는 이상 접속이 안 된다 ~.~

      • VPC 보안 그룹

    • 사실 기존 항목 선택 / 새로 생성 둘 다 의미 없고, 더 중요한 건
      RDS 인스턴스와 연결할 보안 그룹이 인바운드 트래픽과 아웃바운드 트래픽을 허용하고 있는지이다.
      3306 (MySQL 기준) 포트로 네트워크 트래픽이 들어오고 나가게끔 0.0.0.0/0을 지정해주는 게 좋다.
      (사실 보안을 생각한다면 이렇게 하지 말자. 접속할 사람들의 IP만 받아오는 게 Best…)
      나머지는 별 다른 세팅없이 그대로 진행해주면 된다.
      DB 인증도 암호 인증 그대로 진행해주고, 추가 구성의 백업도 자동 백업을 활성화해준다. 별로 더 건드릴 필요가 없다.

  5. 마지막으로 데이터베이스 생성을 눌러주면 완료!

📍 JPA with RDS 세팅

스프링 부트 프로젝트가 우린 다 설정되어 있으므로 그 부분 바로 패스하고, 데이터베이스 설정부터 갑니다.

  1. 데이터 베이스 설정

    src/main/resources/application.properties 파일로 들어가서 데이터베이스 연결 정보를 설정함.

    spring.datasource.url=jdbc:mysql://your-rds-endpoint:3306/your-scheme-name
    spring.datasource.username=your-username
    spring.datasource.password=your-password
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
    • 저 username, password의 경우 위의 RDS에서 세팅해줬던 마스터 정보들을 입력하면 됨. scheme-name은 입력 안해도 일단 Spring boot와 RDS를 연결이 되긴 함. (테이블 CRUD와는 별개의 문제)
    • 만약 com.mysql.cj.jdbc.Driver에 빨간 줄이 뜬다면 아직 Spring boot에 관련 JPA, JDBC(Java Database) Driver 라이브러리가 설치 되지 않은 것이므로 설치해주자. 관련 라이브러리는 아래와 같다.
      1. spring-boot-starter-data-jpa

      2. spring-boot-starter-data-jpa

      3. mysql-connector-java

      4. javax.persistence-api

        이 프로젝트는 pom.xml을 사용하므로 아래에 dependency 설정을 추가했다.

        maven은 세팅이 또 다르지만 이것과 비슷하므로 그냥 maven denependency 세팅에 위 4개의 라이브러리를 추가하자.

        	 	<dependency>
            		<groupId>org.springframework.boot</groupId>
        			<artifactId>spring-boot-starter-data-jpa</artifactId>
        		</dependency>
        		<dependency>
            		<groupId>org.springframework.boot</groupId>
            		<artifactId>spring-boot-starter-data-jpa</artifactId>
        		</dependency>
        		<dependency>
        			<groupId>mysql</groupId>
        			<artifactId>mysql-connector-java</artifactId>
        			<version>8.0.33</version>
            	</dependency>
        		<dependency>
        			<groupId>javax.persistence</groupId>
        			<artifactId>javax.persistence-api</artifactId>
        			<version>2.2</version>
        		</dependency>
    1. 그 다음 엔터티 클래스를 생성해주자.

      JPA 엔터티 클래스를 생성하고 필요한 필드와 관계를 정의해주자.

      참고로 엔터티 클래스는 Entity 패키지 밑에 넣어주는 게 좋다.

      아래는 엔터티 클래스 예시이다.

      @Entity
      public class User {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          private String username;
          private String email;
      
          // Getters and setters
      }
    2. 다음으로 repository를 세팅해준다.

      마찬가지로 엔터티 클래스는 repository 패키지 밑에 넣어주는 게 좋다.

      import org.springframework.data.jpa.repository.JpaRepository;
      
      public interface UserRepository extends JpaRepository<User, Long> {
          // 사용자 정의 쿼리 메서드를 추가할 수 있음
      }
    3. 다음으로 서비스 및 controller 패키지를 만든 후, 각각 그 안에 클래스를 생성하여 http 요청을 처리해주도록 한다.

    4. 그 후 main 메소드가 있는 클래스로 들어가서 run 해주면 된다.

profile
개발자에서, IT Business 담당자로. BrSE 업무를 수행하고 있습니다.

0개의 댓글

관련 채용 정보