Spring Boot 프로젝트 - MySQL 연동, JPA 사용하기

정지효·2023년 8월 19일
post-thumbnail

서론

스프링부트에서 MySQL을 사용하기 위해 MySQL을 연동해보자.
MySQL 설치 방법

유저 생성 및 권한 부여

MySQL 을 설치한 이후에 설치된 디렉토리에서 MySQL을 실행한다.

./mysql -uroot -p[root 패스워드]

아래와 같이 gues5_dev 데이터베이스를 생성하고, 유저 jpauser를 생성 및 데이터베이스 권한을 부여했다.

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select user, host from user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)


mysql> create user 'jpauser'@'%' identified by '[비밀번호]';
Query OK, 0 rows affected (0.04 sec)

mysql> select user, host from user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| jpauser          | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

mysql> create database gues5_dev;
Query OK, 1 row affected (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| gues5_dev          |

(base) zeehyo@ZeeHyoui-MacBookAir bin % ./mysql -ujpauser -p[비밀번호]
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 16

application.properties

application.properties 는 Spring에서 DB Connection의 구성 정보를 결정하는 파일이다.

\src\main\resources 폴더에 application.properties 파일을 생성해 아래와 같이 데이터베이스 정보를 작성한다.

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/gues5_dev
spring.datasource.username=jpauser
spring.datasource.password=[패스워드]
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.jpa.show-sql: true

Line 1의 Hibernate 속성은 JPA(Java Persistence API)가 database의 구조에 영향을 줄 수 있는 정도에 대한 속성이다.

  • None: MySQL 의 기본값. 아무 영향을 주지 못한다.
  • Update: Entity 구조가 바뀜에 따라 database의 구조를 변경할 수 있다.
  • Create, Create-drop: 데이터베이스를 생성 가능하다.

도메인 생성 (JPA 사용)

🔒 의존성 추가하기 (시큐리티 포함)

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-security'

🔒 User Domain 생성

JPA (ORM) 을 사용하여 User 도메인(엔티티)를 생성함과 동시에 MySQL의 데이터베이스에 update 해보자.
User 도메인은 UserDetails 클래스를 상속받아서 생성하였으며, 필수 메서드들을 override해주었다.

@Table(name = "user")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class User implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false)
    private Long id;

    @Column(name = "email", nullable = false, unique = true)
    private String email;

    @Column(name = "password")
    private String password;

    @Column(name = "nickname")
    private String nickname;

    @Builder
    public User(String email, String password, String nickname, String auth) {
        this.email = email;
        this.password = password;
        this.nickname = nickname;
    }


    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return List.of(new SimpleGrantedAuthority("user"));
    }

    @Override
    public String getUsername() {
        return email;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}
  • @Entity : Hibernate에게 테이블 생성을 명령함
  • @GeneratedValue : Primary Key의 자동생성 값을 명시

@Builder 는 lombok의 어노테이션으로, @AllArgsConstructor 와 마찬가지로 생성자의 역할을 하지만 사용시에 생성자의 각 인자를 분리해서 Build (Builder 패턴 참고) 하는 것이 특징이다.

🔒 UserRepository, UserDetailsService 생성

사용자의 이메일을 통해 유저정보를 가지고 올 수 있는 Repository 와 Service를 각각 생성한다.

// AUTO IMPLEMENTED by Spring into a Bean called userRepository
public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByEmail(String email);
}

JpaRepositoryPagingAndSortingRepository => (CrudRepository를 상속받음), QueryByExampleExecutor 를 상속받는 인터페이스이다.
CrudRepository
save(), findById(), existsById(), count(), deleteById(), delete(), deleteAll()
QueryByExampleExecutor
findOne(), findAll(), count(), exists()

@RequiredArgsConstructor
@Service
public class UserService implements UserDetailsService {

    private final UserRepository userRepository;

    @Override
    public User loadUserByUsername(String email) {
        return userRepository.findByEmail(email)
                .orElseThrow(() -> new IllegalArgumentException(email));
    }
}

🔒 Password Encoder Bean

@Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }

마치며

User Domain을 만들고 앱을 실행하니 MySQL 에 정상적으로 user 테이블과 칼럼들이 생성된 것을 확인할 수 있다. ORM 만세!

다음 포스트에는 유저 정보를 생성하는 회원가입 API 및 Service를 만들어볼 예정이다.

참고

profile
백엔드 개발자

0개의 댓글