블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형
MySQL 설치
설치는 아래 글 참고
2020/10/30 - [Database/RDB] - MySQL 설치하기 (Mac OSX)
스키마 & 테이블 생성
유저 생성 및 권한 부여
CREATE USER test_user@localhost IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES ON STUDY_DB.* TO test_user@localhost;
스키마 생성
CREATE DATABASE STUDY_DB default CHARACTER SET UTF8;
테이블 생성
CREATE TABLE IF NOT EXISTS STUDY_DB.USER (
ID BIGINT(20) NOT NULL AUTO_INCREMENT,
ACCOUNT VARCHAR(45) NOT NULL,
EMAIL VARCHAR(45),
PHONE_NUMBER VARCHAR(45),
CREATED_AT DATETIME NOT NULL,
CREATED_BY VARCHAR(45) NOT NULL,
UPDATED_AT DATETIME,
UPDATED_BY VARCHAR(45),
PRIMARY KEY(ID)
);
의존성 추가 (build.gradle)
dependencies {
compile 'org.springframework.boot:spring-boot-starter-data-jpa'
compile 'mysql:mysql-connector-java'
}
application.properties 추가
# DB Source URL
spring.datasource.url=jdbc:mysql://<IP>:<Port>/<DB>?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul
# DB username
spring.datasource.username=<username>
# DB password
spring.datasource.password=<password>
# JPA 쿼리문을 보여줌
spring.jpa.show-sql=true
예를들어서 아래와 같이 작성
spring.datasource.url=jdbc:mysql://localhost:3306/STUDY_DB?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul
spring.datasource.username=test_user
spring.datasource.password=1234
spring.jpa.show-sql=true
JPA Entity 생성
User.java
를 생성한다.
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Builder
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // mysql의 AUTO_INCREMENT를 그대로 사용
private Long id;
@Column(nullable = false)
private String account;
private String email;
private String phoneNumber;
@Column(nullable = false)
private LocalDateTime createdAt;
@Column(nullable = false)
private String createdBy;
private LocalDateTime updatedAt;
private String updatedBy;
}
사용 어노테이션 정리
@Entity
: DB의 테이블을 뜻함@Table
: DB 테이블의 이름을 명시 (테이블 명과 클래스 명이 동일하면 따로 설정하지 않아도 됨)@Id
: Index primary key를 뜻함@Column
: DB Column을 명시@GeneratedValue
: Primary Key의 전략(Strategy)를 설정할 수 있음
JPA Repository 생성
UserRepository.java
를 생성한다.
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
@Repository
- 따로 쿼리문 작성없이 생성, 조회, 업데이트, 삭제(CRUD)를 할 수 있게 기능을 제공해줌
- 제너릭 타입으로는 첫번째부터, <Entity, PrimaryKey의 타입>을 넣는다
테스트를 통해 기능 확인
UserRepositoryTest.java 생성
create 테스트
Insert를 할때는 Repository 객체의 save()
메소드를 사용한다.
@Slf4j
public class UserRepositoryTest extends StudyApplicationTests {
@Autowired
private UserRepository userRepository;
@Test
public void create() {
// User 생성
User user =
User.builder()
.account("Test User 03")
.email("testuser03@google.com")
.phoneNumber("010-1234-5678")
.createdAt(LocalDateTime.now())
.createdBy("admin")
.build();
// Create!
User newUser = userRepository.save(user);
log.info(newUser.toString());
}
}
read 테스트
findById()
를 통해 기본키를 넣어주면, 거기에 해당하는 User 객체를 Optional
타입으로 반환함
@Slf4j
public class UserRepositoryTest extends StudyApplicationTests {
@Autowired
private UserRepository userRepository;
...
@Test
public void read() {
Optional<User> user = userRepository.findById(2L);
user.ifPresent(
selectUser -> { // ifPresent: 값이 있다면, 가져옴
log.info(selectUser.toString());
});
}
}
update 테스트
findById()
메소드로 기존 User 객체를 가져온다음, User 의 정보를 수정한 뒤 다시 save()
하여 수정한다.
- 주의.
findById
할때와save
할때 객체의 ID 값이 동일해야 함
@Slf4j
public class UserRepositoryTest extends StudyApplicationTests {
@Autowired
private UserRepository userRepository;
...
@Test
public void update() {
Optional<User> user = userRepository.findById(2L);
user.ifPresent(
selectUser -> {
User newUser =
User.builder()
.id(selectUser.getId())
.account(selectUser.getAccount())
.phoneNumber(selectUser.getPhoneNumber())
.email("updatedEmail@google.com")
.createdAt(selectUser.getCreatedAt())
.createdBy(selectUser.getCreatedBy())
.updatedAt(LocalDateTime.now())
.updatedBy("TestUser02")
.build();
userRepository.save(newUser);
});
}
}
delete 테스트
findById()
로 User를 가져온뒤에, 있다면 삭제를 진행.- 삭제를 할때는
deleteById()
메소드를 사용 - 삭제 후 제대로 삭제됐는지 한번 더 조회하여 확인
@Slf4j
public class UserRepositoryTest extends StudyApplicationTests {
@Autowired
private UserRepository userRepository;
...
@Test
@Transactional
public void delete() {
Optional<User> user = userRepository.findById(1L);
// User가 있어야 함
Assertions.assertTrue(user.isPresent());
// 있다면 삭제
user.ifPresent(
selectUser -> {
userRepository.deleteById(selectUser.getId());
});
// 지워졌는지 확인
Optional<User> deletedUser = userRepository.findById(1L);
Assertions.assertFalse(deletedUser.isPresent());
}
}
관련 글
2020/10/31 - [Spring/Spring Boot] - Spring Boot 와 MySQL 연동하기 (Maven 프로젝트)
2020/10/31 - [Spring/Spring Boot] - Spring Boot 에서 JPA 사용하기 (MySQL 사용)
반응형
'Backend > Spring Boot' 카테고리의 다른 글
Spring Boot - REST API를 위한 snake_case 공통 설정 (0) | 2020.11.15 |
---|---|
JPA 오류 해결 - Unable to locate Attribute with the the given name [Column] (0) | 2020.11.14 |
SpringBoot와 @PostMapping, @RequestBody 예제 (0) | 2020.11.11 |
Spring Boot와 @RequestMapping, @GetMapping, @RequestParam 예제 (1) | 2020.11.11 |
Spring Boot 와 MySQL 연동하기 (Maven 프로젝트) (0) | 2020.10.31 |