memostack
article thumbnail
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.tistory.com/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형

MySQL 설치

설치는 아래 글 참고

2020/10/30 - [Database/RDB] - MySQL 설치하기 (Mac OSX)

 

MySQL 설치하기 (Mac OSX)

MySQL 설치 본 글에서는 Homebrew 를 이용하여 MySQL 을 설치한다. $ brew update $ brew install mysql 만약, 특정 버전을 따로 설치하고 싶다면 아래 명령어를 수행한다. 그리고, 원하는 버전의 mysql을 설치한..

memostack.tistory.com

 

스키마 & 테이블 생성

유저 생성 및 권한 부여

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 테스트

  1. findById()로 User를 가져온뒤에, 있다면 삭제를 진행.
  2. 삭제를 할때는 deleteById() 메소드를 사용
  3. 삭제 후 제대로 삭제됐는지 한번 더 조회하여 확인
@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 프로젝트)

 

Spring Boot 와 MySQL 연동하기 (Maven 프로젝트)

의존성 추가 아래와 같이 java와 mysql 커넥터 의존성을 pom.xml에 추가한다. mysql mysql-connector-java application.properties 설정 spring.datasource.url에는 DB명을 작성 spring.datasource.username에는..

memostack.tistory.com

2020/10/31 - [Spring/Spring Boot] - Spring Boot 에서 JPA 사용하기 (MySQL 사용)

 

Spring Boot 에서 JPA 사용하기 (MySQL 사용)

MySQL 설정 MySQL 설치 MySQL 설치는 아래 글 참고 2020/10/30 - [Database/RDB] - MySQL 설치하기 (Mac OSX) MySQL 설치하기 (Mac OSX) MySQL 설치 본 글에서는 Homebrew 를 이용하여 MySQL 을 설치한다. $ brew..

memostack.tistory.com

 

반응형
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.tistory.com/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
profile

memostack

@bluemiv_mm

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!