2022 Masters Course/Project Course

2022 마스터즈 코스(백엔드) 82일차 회고(2022. 5. 10.) - "꾸준함의 중요성"

ikjo 2022. 5. 10. 23:35

해당 글은 코드스쿼드 2022 마스터즈 코스 "Java 웹 백엔드" 과정을 수강하면서 학습한 내용 등에 대한 회고 글입니다. :)

 

수강 회고

오늘은 개인 학습 정리를 시작한지 2일차가 되는 날이다. 1주일간의 방학 이후로 어제 하루는 다소 무기력하게 보냈었기에 오늘 하루는 좀 더 착실(?)하게 하루를 보내고자 했다. 🤣 그동안 마스터즈 코스 과정을 하면서는 정해진 일과표 안에서 하루를 보냈었다. 예를 들면, 10시에서 10시 30분까지는 소모임원들과 간단하게 스크럼을 하고 10시 30분부터 12시 30분까지는 줌에서 모각코를 진행하는 등 정해진 시간을 기준으로 하루를 보내곤 했었다. 하지만 이번 자유 프로젝트(개인 학습 정리) 주간부터는 정해진 일과표가 따로 없다보니 시간이 약간 붕 뜬 느낌을 받았다.

 

그동안 정해진 일과표 안에 있으면서 약간의 자유(?)를 갈망하곤 했었지만 막상 자유의 몸이 되버리니 무언의 압박감이 느껴졌다. (자유에는 책임이 따른다..?) 그리하여 나름대로의 하루 일과표 작성이 필요하다고 생각하여 하루 일과표를 작성하는 시간을 가졌다. 사실 2주라는 이번 개인 학습 정리 시간이 짧으면 짧고 길면 길다고 할 수 있는 시간인데, 그래도 10일(주말 제외)이라는 시간 동안 무언가를 하루에 꾸준히 함으로써 얻을 수 있는 성과가 분명히 있다고 생각한다. 아울러 학습과 관련된 것도 중요하지만 이번 2주라는 시간 동안에는 하루에 운동을 꾸준히 하는 것도 목표로 하고자 한다. 💪

 

 

학습 회고

어제 JPA 프로젝트 초기화 작업에 이어 오늘은 JPA를 이용하여 간단하게 데이터를 저장, 수정, 조회하는 작업을 진행해보았다.

 

간단한 작업을 하기 앞서 우선 h2 데이터베이스에 member 테이블을 다음과 같이 생성해주었다.

 

create table Member ( 
  id bigint not null, 
  name varchar(255), 
  primary key (id) 
);

 

우선 다음과 같이 Member 클래스를 선언하고 이를 JPA가 관리하도록 @Entity을 붙였다. JPA를 사용해서 데이터베이스 테이블과 클래스를 매핑시키기 위해서는 Entity 애노테이션이 필수이다. 참고로 final 클래스, inner 클래스, enum, interface에는 Entity 애노테이션을 사용할 수 없다. 또한, Id 애노테이션을 통해 Long형 id를 PK로 선언해주었다.

 

package hellojpa;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Member {

    @Id
    private Long id;
    private String name;

    public Member() { } // JPA는 리플렉션을 이용하기 때문에 동적으로 객체를 생성해야하기 때문에 기본 생성자가 있어야 한다.

    public Member(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Member{" +
            "id=" + id +
            ", name='" + name + '\'' +
            '}';
    }
}

 

이후 메인 메서드를 만든 후 가장 먼저 EntityMangerFactory 객체를 생성해주었다. 이는 데이터베이스 연결 등을 수행하며 데이터베이스당 단 한개만 생성되고 이 하나를 애플리케이션 전체에서 공유하게 된다. 또한 EntityMangerFactory를 통해서 EntityManager 객체를 생성해주었는데, 이는 Entity를 관리해주는 역할을 하며 사용자 요청이 올 때마다 썼다가 버렸다가 계속 동작하며 쓰레드간의 공유되지 않는 객체이다. 이제 이 EntityManager를 통해 EntityTransaction 객체를 생성하여 트랜잭션을 시작해주고(begin 메서드) 이 트랜잭션 안에서 EntityManager 객체를 통해 저장, 조회, 수정 작업들을 처리할 수 있다. (JPA의 모든 데이터 변경은 트랜잭션 안에서 실행된다.)

 

package hellojpa;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaMain {

    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {

            // ...

            tx.commit();

        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }

        emf.close();
    }
}

 

먼저 Member 데이터를 저장하기 위해서는 다음과 같이 EntityManager의 persist 메서드를 이용할 수 있다. 데이터로 저장할 Member 객체를 생성하여 persist 메서드를 호출해주기만 하면 된다. 여기서 주의해야할 점은 persist 메서드를 호출하자마자 JPA가 DB에 INSERT SQL을 전송하는 것이 아니라 영속성 컨텍스트 내 '쓰기 지연 SQL 저장소'에 모아 놓았다가 커밋하는 순간 DB에 SQL이 전송된다는 점이다. 이 부분은 영속성 컨텍스트에 대해 다룰 때 별도로 정리하고자 한다.

 

em.persist(new Member(5L, "helloE")); // 회원 저장

 

앞서 저장했었던 Member 데이터를 (단일) 조회하기 위해서는 EntityManager의 find 메서드를 이용하면 된다. 첫 번째 인자로는 매핑해올 클래스를 두었고 두 번째 인자로는 조회하기 위한 PK 값을 두었다.

 

Member member = em.find(Member.class, 5L);

 

앞서 조회했었던 Member 데이터를 수정할 수도 있는데, 이때는 Member 객체의 setter 메서드를 이용해볼 수 있다. 이후 별다른 처리 없이도 (커밋 이후에) DB의 필드값을 수정할 수 있게 된다.

 

member.setName("UPDATE"); // 회원 정보 수정

 

EntityManager의 createQuery 메서드를 이용하면 여러개의 Member 데이터를 조회할 수 있다. 이때 createQuery는 JPQL을 이용하는데 JPQL이란 SQL을 추상화한 것으로 객체 지향적인 쿼리 언어와도 같다. SQL이 데이터베이스 테이블을 대상으로 쿼리를 실행한다면 JPQL은 엔티티 객체를 대상으로 쿼리를 실행하는 것이라고 볼 수 있다. 이러한 기능은 JPA에서 전체 또는 부분 검색 쿼리를 가능하도록 도와준다.

 

            List<Member> members = em.createQuery("select m from Member as m", Member.class) // 쿼리 인스턴스 생성
                .setFirstResult(1) // offset
                .setMaxResults(2) // limit
                .getResultList(); // 회원 목록 조회

 

이러한 데이터를 조회하거나 변경하는 작업들은 모두 EntityTransaction 라는 트랜잭션 안에서 이루어지게 된다. 이처럼 JPA를 사용하면 마치 DB 데이터 처리 작업을 SQL에 의존하지 않고 마치 컬렉션에 데이터를 넣고 빼듯이 처리할 수 있게 된다. (자바 객체지향 프로그래밍과 관계형 데이터 베이스의 패러다임 충돌 해결)

 

 

학습 참고자료

  • 인프런 "자바 ORM 표준 JPA 프로그래밍 - 기본편" 

 

 

좋았던 점

  • 어제 오늘 연속으로 가벼운 홈트레이닝을 꾸준히(아직 2일밖에 되진 않았지만..) 하고 있어 보람있습니다. 🥕

 

 

아쉬웠던 점

  • 개인 학습 정리라는 아주 귀중한 시간이 주어졌지만 막상 이를 제대로 활용하지 못한 것 같아 아쉬웠습니다. 💦

 

 

이전 보다 개선되었던 점

  • 어제, 오늘 다소 시간이 붕 뜬 채로 하루를 보냈지만 하루 일과표를 작성하다보니 뭔가 앞으로 2주간 잘 해낼 수 있을 것 같다는 자신감이 들었습니다. 👍