문제 상황총 4개의 테이블과 관련 있는 데이터를 뽑아야 하는 상황이다.JPA만을 이용해서 14건의 쿼리가 나가던 것을 MyBatis로 직접 JOIN 쿼리를 작성해서 2건으로 줄였다. 문제 원인 Blog main 화면에 게시글(post) 정보를 나타내야 하는데, 여러 가지 이유로 post_tag와 tag 엔티티를 나눠놨고, member 테이블의 데이터를 하나의 DTO에 담아야 하는 상황이다. DB 설계에 문제가 있을 수도 있고, 비즈니스 요구사항과 정규화를 위해 어쩔 수 없는 것일 수도 있다.이 프로젝트 설계할 당시에는 관련 지식이 거의 없었고, 감으로 설계했다...MongoDB 도입처음엔 쿼리가 너무 많이 나가서, 해당 DTO 조회만을 위한 데이터를 테이블로 빼서 MongoDB Document로 저장..
예제 소스코드(Google Drive)https://drive.google.com/file/d/1YrsS9-sjHM4QSLhe-5GZsvcfVlvMI_Z9/view?usp=sharingapplication.property 파일 수정해서 DB 연결해서 테스트해 보실 수 있습니다. (소스코드에서는 xxx처리) JPQL을 이용해서 DTO를 반환??? JPA를 이용하는 경우, 특정 상황에서 Entity 전체가 아닌 일부 컬럼만을 가져오고 싶을 때, @Query 어노테이션 내에 작성하는 JPQL에서 Java 객체를 생성하는 코드를 추가하는 방법을 사용할 수 있다. Spring-data-jpa가 제공하는 JpaRepository 인터페이스를 이용할 것이고, 회원과 주문으로 구성된 간단한 예제이다.회원(MemberE..
Spring 웹 개발 관련 질문 모음입니다. 자세한 내용은 추가로 검색을 해보셔서, 본인의 언어로 정리하시길 추천드립니다. 이 글 역시 제 생각과 언어에 맞게 정리하였고, 틀린 부분이 있을 수 있으니 댓글로 지적해 주시면 감사하겠습니다! [ Spring ] 💡IoC(Inversion of Control) 란? ⬇️Answer 더보기 제어의 역전 IoC는 객체의 생성과 관리를 스프링 프레임워크가 대신하도록 위임 스프링 컨테이너에 Bean을 미리 등록하고, 필요한 곳에서 컨테이너에서 빈을 가져와 사용할 수 있게 됩니다. 이때, Bean을 가져올 때 의존성 주입(DI) 방식을 사용하여 객체 간의 의존성을 자동으로 주입받을 수 있게 됩니다. 💡DI (Dependency Injection) 란? ⬇️Answer ..
JPA 연관관계 매핑의 종류 JPA 연관관계 매핑의 종류는 @ManyToOne, @OneToMany, @OneToOne, @ManyToMany가 있다. 이 글에서는 @ManyToMany 관계에 대해 다룬다. @ManyToMany : 다대다 매핑 RDBMS는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다. 따라서 연결 테이블을 추가해서 다대다 관계를 일대다 + 다대일 관계로 풀어내야 한다. 결론적으로는 다대다 매핑은 실무에서 사용하지 않는 방법이라고 한다. @ManyToMany 양방향 매핑 example @Entity public class Member { @Id @GeneratedValue private Long id; private String username; @ManyToMany @JoinT..
테이블 간의 연관관계 기존 테이블 간의 연관관계 설정 기본적으로 데이터베이스에서 엔티티(테이블) 간의 연관관계는 Foreign Key를 통해서 하는 것을 알고 있을 것이다. 그러나 Java에서 이 Key를 가지고 다른 테이블을 넘나들려면 꽤나 긴 과정이 필요하다. Member 엔티티와 멤버가 소속된 Team 엔티티를 가정해 보자. [JPA 사용 시 가능해지는 연관관계 설정 예제] 더보기 예제(memberId로 멤버가 소속된 팀의 이름을 찾아보자) Member객체는 필드로 Long teamId를 갖고 데이터베이스 MEMBER 테이블이 TEAM_ID 럼을 갖게 될 것이다. 이런 경우 memberA라는 멤버의 team의 이름을 구하려고 하면 어떻게 해야 할까? Member member = memberRepos..
JPA 연관관계 매핑의 종류 JPA 연관관계 매핑의 종류는 @ManyToOne, @OneToMany, @OneToOne, @ManyToMany가 있다. 이 글에서는 @OneToOne 관계에 대해 다룬다. 아래 예제에서는 Member(멤버)가 하나씩 가질 수 있는 Locker(사물함)을 가정했다. @OneToOne(일대일 매핑) 기본적으로 @ManyToOne의 매핑 관계와 유사하다. Member와 Locker(사물함) 엔티티가 1대 1 매핑된다고 가정하자. 일대일 매핑시에는 FK에 unique 제약조건을 추가하는 것이 좋다. 일대일 단방향 (ex 1) (Member가 연관관계의 주인) @Entity public class Member { @Id @GeneratedValue private Long id; p..
JPA 연관관계 매핑의 종류 JPA 연관관계 매핑의 종류는 @ManyToOne, @OneToMany, @OneToOne, @ManyToMany가 있다. 이 글에서는 @ManyToOne과 @OneToMany 관계에 대해 다룬다. 아래 예제에서는 Team에 속해있는 여러 Member들을 가정했다. @ManyToOne(다대일 매핑) 가장 많이 사용하는 연관관계로 여러 개(Many)의 멤버가 한 개(One)의 팀에 속해있는 것을 생각하면 된다. Member가 Team의 ID를 FK로 갖게 된다. 이러한 관계에서 연관관계의 주인은 Member이다. @Entity public class Member { @Id @GeneratedValue private Long id; private String username; @..
필드와 컬럼 매핑 엔티티 클래스의 각 필드에 여러 가지 옵션을 갖는 어노테이션을 붙여서 더 자세히 매핑할 수 있다. Column 별 매핑 상세 @Column : 컬럼 DB 테이블의 각 컬럼 관련 제약사항 등을 추가할 수 있다. @Enumerated : enum 타입 DB에는 enum 타입이 없기 때문에 속성을 지정할 수 있다. enum은 기본적으로 숫자, 문자열 두 가지가 있다. @Enumerated(EnumType.STRING) private RoleType roleType; EnumType.STRING으로 지정하면 실제 enum의 문자열이 저장되고, EnumType.ORDINAL로 지정하면 enum 순서를 0부터 시작되는 숫자로 지정된다. STRING이 권장되고, ORDINAL은 사용하지 않는 게 좋..