본문 바로가기

Spring Boot

[Spring Boot] MySQL 연결하기

728x90

의존성 (Dependencies)

Lombok

  • 역할: 반복적인 코드 생성을 줄여주는 라이브러리입니다. 예를 들어, getter/setter, toString, equals, hashCode 메서드 등을 자동으로 생성해줍니다.
  • 주요 기능: @Getter, @Setter, @ToString, @Builder, @AllArgsConstructor, @NoArgsConstructor 등.

Spring Web

  • 역할: 스프링 기반 웹 애플리케이션 개발을 위한 의존성으로, HTTP 요청/응답 및 RESTful API 구현에 사용됩니다.
  • 주요 기능: Spring MVC, REST API 지원, 웹 애플리케이션의 엔드포인트 설정.

Spring Data JPA

  • 역할: JPA(Java Persistence API)를 쉽게 사용하기 위한 스프링 모듈로, 데이터베이스와의 상호작용을 간소화합니다.
  • 주요 기능: 데이터베이스 쿼리를 자동으로 생성하거나, JPA를 기반으로 한 리포지토리 인터페이스 제공.

MySQL Driver

  • 역할: MySQL 데이터베이스와의 연결을 가능하게 하는 JDBC 드라이버입니다. 애플리케이션이 MySQL 데이터베이스와 통신할 수 있도록 도와줍니다.
  • 주요 기능: MySQL 데이터베이스 연결, SQL 쿼리 실행, 트랜잭션 처리.

 

환경 설정

프로젝트의 src > main > resources > application.properties를 application.yaml으로 변경해주세요.

 

properties -> yaml로 변경하는 이유

  • 가독성: YAML은 계층 구조를 시각적으로 표현할 수 있어 가독성이 높습니다.
  • 중복 제거 및 코드의 간결성: YAML은 중첩된 구성을 쉽게 표현할 수 있어 중복을 줄일 수 있습니다.
  • 다른 시스템과의 호환성: YAML은 다양한 시스템에서 널리 사용되며, JSON과 유사한 형식으로 다른 도구와의 연동이 용이합니다.

properties 예시:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret

yaml 예시:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: secret

 

yaml 기본 설정

spring:
  jpa:
    show-sql: true  # 실행되는 SQL 쿼리를 콘솔에 출력
    properties:
      format_sql: true  # SQL 쿼리를 가독성 높게 포맷팅
      dialect: org.hibernate.dialect.MySQL8Dialect  # MySQL 8에 최적화된 방언 사용
    hibernate:
      ddl-auto: validate  # 엔티티 클래스와 데이터베이스 테이블이 일치하는지 검증
  datasource:
    url: jdbc:mysql://localhost:3306/user?useSSL=false&useUnicode=true&allowPublicKeyRetrieval=true  # 데이터베이스 연결 URL
    driver-class-name: com.mysql.cj.jdbc.Driver  # MySQL 데이터베이스 드라이버
    username: root  # 데이터베이스 사용자 이름
    password: 1234  # 데이터베이스 비밀번호

 

추가로 설정할 수 있는 옵션

    # spring.datasource.initialization-mode: always  # 애플리케이션 시작 시 데이터베이스 초기화 스크립트를 실행
    # spring.datasource.hikari.maximum-pool-size: 10  # 커넥션 풀에서 최대 커넥션 수 설정
    # spring.jpa.open-in-view: false  # 트랜잭션 종료 후 영속성 컨텍스트를 닫음
    # spring.jpa.generate-ddl: true  # 엔티티 정보를 기반으로 DDL 자동 생성
    # spring.jpa.hibernate.naming.physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl  # 테이블 및 칼럼 이름 변환 전략 설정

 

엔티티 객체 생성하기

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity(name = "user")  // JPA 엔티티로 지정하며, 데이터베이스 테이블 이름을 "user"로 설정
public class UserEntity {

    @Id  // 해당 필드를 엔티티의 기본 키로 지정
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 기본 키의 값을 데이터베이스에서 자동 생성하도록 설정
    private Long id;  // 사용자 ID

    private String name;  // 사용자 이름

    private Integer age;  // 사용자 나이

    private String email;  // 사용자 이메일
}
  • 속성과 이름 일치: JPA 엔티티 클래스의 필드 이름은 데이터베이스 테이블의 칼럼 이름과 일치해야 합니다. 이 일치는 Hibernate가 엔티티 객체를 데이터베이스에 저장할 때 정확한 매핑을 수행할 수 있게 도와줍니다. 예를 들어, name 필드는 user 테이블의 name 칼럼과 연결되어야 하며, 그렇지 않으면 데이터베이스와의 통신에서 오류가 발생할 수 있습니다.

 

Repository 생성

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<UserEntity, Long> {
}

 

Controller 만들기

@RequiredArgsConstructor
@RestController
public class UserApiController {

    private final UserRepository userRepository;

    @GetMapping("/find-all")
    public List<UserEntity> findAll() {
        return userRepository.findAll();
    }
}

 

테스트 해보기

  • http://localhost:8080/find-all

 

 

추가적으로 Entity 객체와 매핑하지 않는 것이 좋은 이유

  1. 데이터 은닉
    • DTO는 클라이언트에 전달할 데이터만 포함하므로, 엔티티의 모든 속성을 노출하지 않습니다.
    • 이는 보안성을 높이고 불필요한 데이터 노출을 방지합니다.
  2. 구조 분리
    • DTO를 사용하면 데이터의 구조를 클라이언트와 서버 간에 명확히 분리할 수 있습니다.
    • 클라이언트에서 필요한 데이터만 포함되므로 데이터 전송이 간편해집니다.
  3. 유효성 검사 및 변환
    • DTO를 사용하면 데이터 전송 중 유효성 검사를 더 쉽게 수행할 수 있습니다.
    • DTO에 필요한 검증 어노테이션을 추가하여 입력 데이터를 검증할 수 있습니다.
    • DTO를 다른 형식의 데이터를 수신하고 변환하는 데 유용합니다.
  4. 퍼포먼스 최적화
    • 엔티티는 종종 데이터베이스의 전체 테이블 구조를 반영하므로 크기가 클 수 있습니다.
    • DTO를 사용하면 필요한 데이터만 전송하여 네트워크 대역폭과 메모리 사용을 줄일 수 있습니다.
  5. 응집성 및 유지보수성 향상
    • DTO를 사용함으로써 엔티티와 비즈니스 로직의 응집성을 높일 수 있습니다.
    • 비즈니스 로직이 DTO를 사용하여 데이터를 처리하므로, 엔티티 구조가 변경되더라도 DTO는 별도로 수정할 수 있습니다.
  6. API 버전 관리
    • DTO를 사용하면 API의 버전을 관리하기 쉬워집니다.
    • 클라이언트가 필요로 하는 데이터 형식이 변경되더라도, 기존 엔티티 구조를 변경하지 않고 DTO를 수정하여 새로운 API 버전을 구현할 수 있습니다.
  7. 데이터 통합
    • 여러 엔티티의 데이터를 통합하여 하나의 DTO로 클라이언트에 전달할 수 있습니다.
    • 이를 통해 여러 데이터 출처에서 오는 정보를 통합하여 클라이언트에게 제공할 수 있습니다.

 

DTO를 모르시는 분들은 여기를 눌러주세요

728x90