영리의 테크블로그

[구름톤 유니브] 1. ERD 설계 및 JPA 복습 본문

dev/구름톤 유니브

[구름톤 유니브] 1. ERD 설계 및 JPA 복습

영리0 2025. 5. 4. 23:14

erd 설계하고 jpa, mybatis 복습하였다.

 

 

팀 회의 설계도

 

요구사항 분석

  • 사용자(Users): 로그인·회원 관리
  • 공연(Shows): 제목, 시간, 장소 등
  • 좌석(Seats): 공연별 구역·행·번호
  • 예약(Reservations): 사용자 ↔ 공연 매핑, 상태 관리
  • 결제(Payments): 예약 단위 결제 정보
  • 매핑 테이블: 예약 ↔ 좌석 (다대다 해소)

개체(Entity) 식별

  1. Users
  2. Shows
  3. Seats
  4. Reservations
  5. ReservationSeats
  6. Payments

관계(Relationship) 정의

  • Users 1:N Reservations
  • Shows 1:N Seats
  • Shows 1:N Reservations
  • Reservations 1:N ReservationSeats
  • Seats 1:N ReservationSeats
  • Reservations 1:1(또는 1:N) Payments

물리 모델링

JPA 정리

  1. 엔티티 매핑
    @Entity @Table(name = "users") public class User { @Id @GeneratedValue private Long id; private String name; private String email; private String passwordHash; private LocalDateTime createdAt; // getter/setter }


  2. 관계 매핑
    • OneToMany / ManyToOne
    • ManyToMany는 중간 테이블(ReservationSeat)로 풀어내는 것이 권장됨
    • fetch 전략 (LAZY vs EAGER) 설정
  3. Repository 인터페이스
    public interface ReservationRepository extends JpaRepository<Reservation, Long> { List<Reservation> findByUserId(Long userId); }
  4. JPQL & QueryDSL
    • 복잡한 조건이 필요할 땐 @Query로 JPQL 직접 작성 
    • 타입 안전성을 위해 쿼리DSL 도입 검토
    • Q.JPA 와 마이바티스 섞어쓴다 했을때 JPQL 대신 마이바티스 를 쓰는 이유는?
    • GPT A. 단순 CRUD 수준이라면 JPA(JPQL)로도 충분하지만,
    • 동적·복잡 SQL, DB 특화 기능, 성능 최적화, 레거시 SQL 재사용 등이 필요할 때는 MyBatis를 섞어 쓰는 것이 훨씬 편리하고 효율적입니다.
  5. 트랜잭션 관리
    • @Transactional 어노테이션으로 서비스 계층 트랜잭션 범위 지정
    • 예외 발생 시 롤백 전략 확인 (rollbackFor 등) 

 

MyBatis 정리

XML 기반 설정과 SQL 매핑을 선호할 때 사용

  1. 설정 파일 (mybatis-config.xml)

    <?xml version="1.0" encoding="UTF-8" ?> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!-- DB 커넥션 설정 --> </dataSource> </environment> </environments> <mappers> <mapper resource="mappers/UserMapper.xml"/> </mappers> </configuration>

  2. 매퍼 XML 예시 (UserMapper.xml)
    <mapper namespace="com.example.mapper.UserMapper"> <select id="selectUser" resultType="User"> SELECT * FROM users WHERE id = #{id} </select> <insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> INSERT INTO users (name, email, password_hash, created_at) VALUES (#{name}, #{email}, #{passwordHash}, #{createdAt}) </insert> </mapper>

  3. Mapper 인터페이스
    public interface UserMapper { User selectUser(Long id); void insertUser(User user); }

  4. 장점 vs 단점
    • 장점: SQL 제어력 극대화, 복잡도 높은 쿼리 유연
    • 단점: XML 관리 부담, 코드↔SQL 분리로 가독성 저하 가능성

결론

JPA Mybatis 섞어야함.

Ibatis 와의 차이점은 뭘까?