팀 프로젝트 시 데이터베이스는 어떻게..? mysql과 h2, jpa와 mybatis

작성하게 된 계기

학교에서는 주로.. 개인프로젝트가 많았고 팀 단위 프로젝트를 제대로 하는 것은 처음이었고 대부분의 팀원들이 그랬기 때문에 나 자신이 공부하면서 다른 팀원들한테도 공유할 겸 작성하게 되었다.

1. 의문점

🧐 흠… 우리는 팀프로젝트 작업을 해야하는데 돌아가는 코드는 로컬(내 컴퓨터에서) 톰캣으로 한다고 해도 데이터베이스는 공유해야 하는데 이걸 어떻게 해야할까..?

팀 프로젝트를 진행할 때 데이터베이스를 어떻게 공유하고 사용하는지에 대한 몇 가지 옵션이 있습니다. 데이터베이스를 공유하려면 팀원들 간에 데이터베이스 접근 권한 및 연결 정보를 공유해야 합니다. 일반적으로 다음과 같은 방법을 사용합니다:

  1. 공용 데이터베이스 서버 사용 (온프레미스 또는 클라우드):

    • AWS RDS (Amazon Relational Database Service): AWS RDS를 사용하여 공용 데이터베이스를 호스팅할 수 있습니다. 팀원들은 AWS RDS 인스턴스에 액세스 권한을 부여받아 데이터베이스에 접근할 수 있습니다.

    • 로컬 데이터베이스: 팀원 중 하나가 로컬 데이터베이스를 호스팅하고 다른 팀원들에게 접근 권한을 부여할 수 있습니다. 이 경우, 데이터베이스 호스트 및 포트 정보를 공유해야 합니다.

  2. 데이터베이스 백업 및 동기화:

    • 데이터베이스의 백업과 동기화를 통해 팀원 간에 데이터 일관성을 유지할 수 있습니다. 주기적으로 데이터베이스를 백업하고 백업 파일을 팀원들에게 전달하여 데이터 손실을 방지합니다.

  3. 환경 변수 및 보안 설정:

    • 데이터베이스 연결 정보와 비밀번호와 같은 민감한 정보는 환경 변수나 비밀 관리 도구를 사용하여 안전하게 관리해야 합니다. 이를 통해 보안을 유지하고 데이터베이스 액세스를 보호할 수 있습니다.

  4. API 및 데이터베이스 엔드포인트 정의:

    • 백엔드 개발자는 데이터베이스와 상호 작용하기 위한 API 엔드포인트를 정의해야 합니다. 이 엔드포인트를 사용하여 프론트엔드에서 데이터베이스에 액세스할 수 있습니다.

2. 두 가지의 사용방법

🧐 AWS RDS (Amazon Relational Database Service) 사용하는 방법

1. AWS 계정 생성 및 로그인:

AWS 계정이 없는 경우 **AWS 웹 사이트**에서 계정을 생성하고 로그인합니다.

2. AWS 콘솔에 로그인:

AWS 계정으로 로그인한 후 AWS 관리 콘솔에 액세스합니다.

3. RDS 대시보드로 이동:

AWS 콘솔에서 "RDS"를 검색하거나, "데이터베이스" 항목을 클릭하여 RDS 대시보드로 이동합니다.

4. 데이터베이스 인스턴스 생성:

  • "데이터베이스 인스턴스 생성" 버튼을 클릭하여 새로운 데이터베이스 인스턴스를 생성합니다.

  • "엔진 옵션"에서 MySQL 또는 원하는 관계형 데이터베이스 엔진을 선택합니다.

  • "프리 티어 사용" 옵션을 선택하면 무료 티어에서 데이터베이스 인스턴스를 생성할 수 있습니다.

5. 인스턴스 설정 구성:

  • "인스턴스 식별자" 및 "마스터 사용자 이름"을 설정합니다. 이것은 데이터베이스 인스턴스에 대한 고유한 이름과 마스터 사용자의 이름입니다.

  • "마스터 암호"를 생성하고 안전하게 보관하세요.

6. 데이터베이스 설정 구성:

  • "데이터베이스 이름"을 지정하고 필요한 설정을 구성합니다.

  • "퍼블릭 액세스 가능성"을 제어하고 필요한 경우 VPC(Virtual Private Cloud) 설정을 구성합니다.

7. 보안 그룹 및 VPC 설정:

  • 데이터베이스 인스턴스에 대한 보안 그룹 및 VPC 설정을 구성하여 액세스 제어를 설정합니다. 보안 그룹을 통해 특정 IP 주소나 범위에서만 데이터베이스에 액세스할 수 있도록 할 수 있습니다.

8. 추가 구성 및 옵션 설정:

  • 필요한 경우 데이터베이스 인스턴스의 추가 구성 및 옵션을 설정합니다. 이 단계에서는 데이터베이스 인스턴스의 성능 및 백업 설정 등을 구성할 수 있습니다.

9. 인스턴스 생성 및 대기:

  • 설정을 완료하면 "인스턴스 생성" 또는 "시작" 버튼을 클릭하여 데이터베이스 인스턴스를 생성하고 대기합니다. 이 과정은 몇 분 정도 걸릴 수 있습니다.

10. 연결 정보 확인:

  • 데이터베이스 인스턴스가 생성되면 해당 인스턴스의 연결 정보를 확인할 수 있습니다. 이 정보에는 엔드포인트 주소, 포트 번호, 마스터 사용자 이름 등이 포함됩니다.

11. 데이터베이스에 연결:

  • 데이터베이스 클라이언트 도구 또는 프로그래밍 언어를 사용하여 데이터베이스에 연결합니다. 연결 정보를 사용하여 데이터베이스에 접속할 수 있습니다.

12. 데이터베이스 사용:

  • 이제 데이터베이스에 연결되었으므로 테이블을 생성하고 데이터를 삽입, 조회, 수정, 삭제 등의 작업을 수행할 수 있습니다.

위 단계를 따라 AWS RDS를 사용하여 MySQL 또는 다른 관계형 데이터베이스를 생성하고 관리할 수 있습니다. 보안 및 성능 관리를 위해 AWS RDS의 다양한 설정 및 옵션을 활용할 수 있습니다. 필요에 따라 데이터베이스 백업 및 복원을 설정하여 데이터의 안전성을 유지할 수도 있습니다.

🧐 로컬 데이터베이스 사용 방법

1. 데이터베이스 시스템 선택:

로컬 환경에서 사용할 데이터베이스 시스템을 선택합니다. 아래는 몇 가지 인기있는 옵션입니다.

  • SQLite: 가벼운 파일 기반 데이터베이스로, 설치 및 설정이 간단하며 작은 프로젝트에 적합합니다.

  • MySQL 또는 PostgreSQL: 무료로 사용할 수 있는 오픈 소스 관계형 데이터베이스 시스템입니다. 프로젝트의 규모와 요구 사항에 따라 선택합니다.

  • MongoDB: NoSQL 데이터베이스로, 비정형 데이터 및 대량 데이터를 다루는 데 적합합니다.

2. 데이터베이스 설치:

선택한 데이터베이스 시스템을 로컬 컴퓨터에 설치합니다. 데이터베이스 공식 웹 사이트에서 설치 파일과 설치 가이드를 다운로드할 수 있습니다.

3. 데이터베이스 설정:

데이터베이스를 설치한 후에는 초기 설정을 수행해야 합니다. 설정에는 다음이 포함됩니다.

  • 데이터베이스 서버 시작: 데이터베이스 서버를 시작하여 데이터베이스에 액세스할 수 있도록 합니다.

  • 관리자 계정 설정: 관리자 계정(예: root 또는 postgres)을 설정하고 암호를 지정합니다.

  • 데이터베이스 생성: 필요한 데이터베이스를 생성합니다.

  • 사용자 및 권한 설정: 데이터베이스에 액세스할 수 있는 사용자를 만들고 액세스 권한을 부여합니다.

4. 데이터베이스 클라이언트 도구 설치:

데이터베이스를 관리하고 쿼리를 실행하기 위한 데이터베이스 클라이언트 도구를 설치합니다. 이 도구는 데이터베이스와 상호 작용할 때 사용됩니다.

5. 애플리케이션과 연동:

로컬 데이터베이스를 사용하려면 애플리케이션 코드에서 데이터베이스에 연결하고 데이터를 읽고 쓸 수 있어야 합니다. 데이터베이스 연결을 설정하고 SQL 또는 NoSQL 쿼리를 실행하여 데이터를 조작합니다.

예를 들어, Java 프로젝트에서 MySQL 데이터베이스를 사용하려면 JDBC(Java Database Connectivity) 드라이버를 사용하여 데이터베이스에 연결하고 SQL 쿼리를 실행합니다.

다른 프로그래밍 언어와 데이터베이스 시스템을 사용하는 경우 해당 언어 또는 데이터베이스에 맞는 라이브러리 또는 드라이버를 설치하고 연동하는 방법을 학습해야 합니다.

로컬 데이터베이스 설정은 프로젝트의 규모와 요구 사항에 따라 달라질 수 있으며, 데이터베이스 종류 및 개발 환경에 따라 다양한 설정이 가능합니다.

3. JPA와 Mybatis가 뭐고 어떤 방식이 좋을까? 어디서 많이 쓸까?

🧐 일단 JPA와 Mybatis가 뭔데?

JPA (Java Persistence API)MyBatis는 둘 다 데이터베이스와 상호 작용하기 위한 Java 프레임워크 또는 라이브러리로 데이터베이스와 상호 작용하는 방식 및 사용 사례에 있어서 중요한 차이가 있다. 선택은 프로젝트 요구 사항과 개발자 선호에 따라 달라지며, JPA객체 중심의 접근 방식을 즐기는 개발자에게 유용하며, MyBatis는 SQL에 대한 더 직접적인 제어를 원하는 경우 유용합니다.

✍️ JPA (Java Persistence API)란?

  1. ORM (Object-Relational Mapping): JPA객체와 데이터베이스 테이블 간의 매핑을 제공하는 ORM 프레임워크로 이것은 객체 지향 언어인 Java 클래스를 데이터베이스 테이블로 자동 매핑해준다.

  2. Entity 클래스: JPA에서는 데이터베이스 테이블과 매핑할 엔터티 클래스를 정의. 예를 들어, MySQL 테이블과 매핑할 User 엔터티 클래스를 생성한다.

  • **@GeneratedValue**는 JPA (Java Persistence API)에서 사용되는 어노테이션

    • 엔티티 클래스의 기본 키(primary key) 값을 생성

    • 주로 자동으로 증가하는 기본 키 (예: AUTO_INCREMENT)를 생성할 때 사용


@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id;
    private String username;
    private String email;
    // getters and setters
}
  1. JPQL (Java Persistence Query Language)

  • JPA는 JPQL을 사용하여 데이터베이스 쿼리를 작성하고 실행하며, JPQL 쿼리는 엔터티 객체에 대한 쿼리를 작성하는 데 사용된다.

  • 쿼리 파일 : PQL 쿼리를 정의한 파일의 확장자는 일반적으로 .jql 또는 **.jpql**로 지정

  • JPQL 쿼리 파일은 src/main/resources (또는 src/test/resources 테스트용으로) 디렉토리 내에 위치

TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE u.username = :username", User.class);
query.setParameter("username", "john_doe");
List<User> users = query.getResultList();

✍️ MyBatis란?

  1. SQL 매핑: MyBatis는 SQL 매핑 파일을 사용하여 데이터베이스 쿼리를 정의하고 실행하고 SQL 매핑 파일은 SQL 쿼리와 Java 메소드를 매핑하여 관리한다.

  2. SQL 매핑 파일 예제

xmlCopy code
<!-- user-mapper.xml -->
<mapper namespace="com.example.UserMapper">
    <select id="getUserByUsername" resultType="com.example.User">
        SELECT * FROM users WHERE username = #{username}
    </select>
</mapper>
  1. Java 인터페이스: MyBatis에서는 SQL 쿼리를 호출할 때 사용할 Java 인터페이스를 정의해야 한다.

public interface UserMapper {
    User getUserByUsername(String username);
}
  1. 사용 예제

User user = userMapper.getUserByUsername("john_doe");

4. 스프링부트 로컬에서 테스트 후 배포 시 사용

🧐 위의 내용을 총 정리

위의 내용은 chat gpt에서 물어본 결과고… 내 의문은 이게 어쨋든 데이터베이스는 ***테이블이나 컬럼명 팀원들끼리 같아야 하는거 아닌가? 그럼 처음부터 AWS나 네이버 클라우드에서 사용해야 하는 거 아닌가?***라고 생각하였다.

A. 강사님한테 물어보고 공부해 본 결과 처음부터 데이터베이스를 설정할 필요는 없는듯하다 배포시에만 하고 로컬에서는 포스트맨이나 이런걸로 값이 잘 들어가는 지 테스트 해보면 될 것 같다.

즉, 사실 스프링부트에서 JPA를 사용하면 데이터베이스는 처음부터 어떤걸 사용할지는 중요하지 않는다. 왜냐하면 H2에서 자동 테이블 생성하고 만들어주니까

✍️ 추가설명

결론적으로, 스프링 부트와 JPA개발자에게 데이터베이스 설정 및 관리를 간소화하며, 처음부터 실제 데이터베이스를 설정할 필요는 없게 해준다. 이러한 편리함은 빠른 개발 및 테스트를 가능하게 하고, 배포 시에 데이터베이스 선택과 구성을 중요하게 고려하도록 한다.

  1. H2 데이터베이스와 자동 테이블 생성

  • 스프링 부트와 JPA를 사용하면 H2 데이터베이스와 같은 인메모리 데이터베이스를 개발 단계에서 쉽게 사용할 수 있다.

  • 이 데이터베이스는 애플리케이션이 시작될 때 자동으로 설정되고, 엔터티 클래스에 기반하여 필요한 데이터베이스 테이블을 자동으로 생성

  1. 포스트맨 및 테스트

  • 개발 중에는 포스트맨과 같은 API 테스트 도구를 사용하여 API 엔드포인트를 호출하고 요청과 응답을 확인하는 것이 일반적

  • 이를 통해 데이터베이스가 정상적으로 작동하며 데이터가 올바르게 처리되는지 확인할 수 있다.

  1. 데이터베이스 선택은 배포 시에 중요

  • 실제로 데이터베이스를 선택하고 구성하는 것은 배포 시에 매우 중요

  • 개발 단계에서는 주로 H2나 인메모리 데이터베이스를 사용하며, 실제 배포 시에는 MySQL, PostgreSQL, Oracle 등과 같은 실제 데이터베이스로 전환하는 것이 일반적

  • 배포 환경에 따라 데이터베이스 연결 정보 및 설정을 조정

  1. Spring Profiles를 활용한 환경 분리

  • 스프링 부트는 Spring Profiles를 사용하여 환경을 분리하고 다른 데이터베이스 설정을 관리할 수 있도록 지원

  • 이를 통해 개발, 테스트, 스테이징 및 프로덕션 환경에서 다른 데이터베이스를 사용할 수 있다.

Q. springboot에서 테스트는 jpa의 h2로 하고 나중에 배포할 때 네이버 클라우드를 쓰는데 데이터베이스는 mysql을 쓸거야 그럼 알아서 네이버 클라우드 설정이 되는 걸까?

Yes, Spring Boot 애플리케이션에서 개발 단계에서 H2 데이터베이스를 사용하고 나중에 배포할 때 MySQL을 사용하려는 경우, Spring Boot의 환경 설정을 적절하게 조정하면 배포 환경에서 MySQL 데이터베이스를 사용할 수 있다. 배포 환경에서 MySQL 설정은 네이버 클라우드에 맞게 조정해야 하며, 연결 주소, 사용자 이름 및 비밀번호를 적절하게 설정해야 한다.

✍️ h2 테스트 후 배포 과정

  1. application.properties 또는 application.yml 설정 변경: 개발 단계에서 H2 데이터베이스를 사용하고 있으며, 배포 시에 MySQL을 사용하려면 application.properties 또는 application.yml 설정 파일에서 데이터베이스 관련 설정을 변경해야 한다. 아래와 같이 설정을 변경할 수 있다.

    propertiesCopy code
    # 개발 단계에서 H2 데이터베이스 사용
    spring.datasource.url=jdbc:h2:mem:testdb
    spring.datasource.driverClassName=org.h2.Driver
    spring.datasource.username=sa
    spring.datasource.password=password
    
    # 배포 시 MySQL 데이터베이스 사용
    # 주의: MySQL 관련 드라이버 의존성을 추가해야 합니다.
    # spring.datasource.url=jdbc:mysql://네이버_클라우드_주소:포트/데이터베이스_이름
    # spring.datasource.username=사용자_이름
    # spring.datasource.password=비밀번호
    
  2. MySQL 드라이버 의존성 추가: MySQL을 사용하기 위해 Maven 또는 Gradle 프로젝트의 종속성에 MySQL 드라이버를 추가

    Maven을 사용하는 경우 pom.xml 파일에 다음 종속성을 추가

    xmlCopy code
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>버전_번호</version>
    </dependency>
    
  3. 배포 환경에서 MySQL 데이터베이스 설정: 네이버 클라우드에서 MySQL을 사용할 수 있도록 데이터베이스를 설정하고 애플리케이션의 배포 설정에 맞게 데이터베이스 연결 정보를 업데이트

Last updated