
스프링부트에서 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.propertiesapplication.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: 데이터베이스를 생성 가능하다.
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'
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 패턴 참고) 하는 것이 특징이다.
사용자의 이메일을 통해 유저정보를 가지고 올 수 있는 Repository 와 Service를 각각 생성한다.
// AUTO IMPLEMENTED by Spring into a Bean called userRepository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
✨
JpaRepository는PagingAndSortingRepository => (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));
}
}
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
User Domain을 만들고 앱을 실행하니 MySQL 에 정상적으로 user 테이블과 칼럼들이 생성된 것을 확인할 수 있다. ORM 만세!

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