묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 데이터 JPA
해당 영상에서 member엔티티의 id값 할당방식
@Id @GeneratedValue Member 엔티티의 id생성이 auto로 디폴트값인데, 영상 7분 10초에 멤버의 객체생성이 하나뿐인 테스트에서id값이 1이아닌 2로 뜨는지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
다음 강의 커리큘럼에 대해 궁금한게 있습니다
안녕하세요. [ 스프링 핵심원리 기본편 / 자바 ORM 표준 JPA 프로그래밍 기본편 / 스프링 입문 ] 이 세 강의를 들은 후 SpringBoot - JPA(Mysql ) 을 활용한 프로젝트를 진행해보고 있습니다. 그런데 [ SpringBoot - JPA(Mysql ) 의 설정 ( application.properties )] , [ 엔티티와 빈 컨테이너 구현 ] 관련해서 어려운게 있어서 추가적으로 강의를 하나 더 듣고 싶은데 1. 모든 개발자를 위한 HTTP 기본 상식 2. 실전! 스프링 부트와 활용 1 3. 실전! 스프링 부트와 활용 2 4. 실전! 스프링데이터 JPA 이 네 가지 강의 중 지금 제가 듣기 적합한게 있을까요? 물론 다 들을 거긴한대 프로젝트와 연관해서 수업을 듣고 싶어 질문남깁니다. 감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@GeneratedValue 작성 후 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. @Id@GeneratedValue(strategy = GenerationType.IDENTITY)private String id; 위 코드 작성 후 오류가 납니다.. String 말고 숫자로 해도 오류가 나네요 ㅠ .. mysql로 바꿨는데 왜 그런지 모르겠습니다ㅠ 오류 -WARN: GenerationTarget encountered exception accepting command : Error executing DDL " create table Member ( id varchar(255) not null auto_increment, name varchar(255) not null, primary key (id) ) engine=MyISAM" via JDBC Statement org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL " create table Member ( id varchar(255) not null auto_increment, name varchar(255) not null, primary key (id) ) engine=MyISAM" via JDBC Statement at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:440) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlStrings(SchemaCreatorImpl.java:424) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:315) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:166) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:135) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:121) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:155) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at hellojpa.JpaMain.main(JpaMain.java:14) Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000d\000a create table Member (\000d\000a id varchar(255) not null auto_increment,\000d\000a name varchar(255) not null,\000d\000a primary key (id)\000d\000a ) engine[*]=MyISAM"; expected "identifier"; SQL statement: create table Member ( id varchar(255) not null auto_increment, name varchar(255) not null, primary key (id) ) engine=MyISAM [42001-210] at org.h2.message.DbException.getJdbcSQLException(DbException.java:521) at org.h2.message.DbException.getJdbcSQLException(DbException.java:496) at org.h2.message.DbException.getSyntaxError(DbException.java:265) at org.h2.command.Parser.readIdentifier(Parser.java:5759) at org.h2.command.Parser.parseCreateTable(Parser.java:9306) at org.h2.command.Parser.parseCreate(Parser.java:6779) at org.h2.command.Parser.parsePrepared(Parser.java:746) at org.h2.command.Parser.parse(Parser.java:674) at org.h2.command.Parser.parse(Parser.java:644) at org.h2.command.Parser.prepareCommand(Parser.java:551) at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:615) at org.h2.server.TcpServerThread.process(TcpServerThread.java:288) at org.h2.server.TcpServerThread.run(TcpServerThread.java:191) at java.base/java.lang.Thread.run(Thread.java:834) at org.h2.message.DbException.getJdbcSQLException(DbException.java:451) at org.h2.engine.SessionRemote.done(SessionRemote.java:607) at org.h2.command.CommandRemote.prepare(CommandRemote.java:85) at org.h2.command.CommandRemote.<init>(CommandRemote.java:51) at org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:477) at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1292) at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:217) at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:205) at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54) ... 15 more 오류 member package hellojpa;import javax.persistence.*;import java.math.BigDecimal;import java.time.LocalDate;import java.time.LocalDateTime;import java.util.Date;@Entitypublic class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private String id; @Column(name = "name", nullable = false) private String username; public Member(){ } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; }} jpaMain package hellojpa;import org.hibernate.internal.build.AllowSysOut;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.EntityTransaction;import javax.persistence.Persistence;import java.util.List;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{ Member member = new Member(); //member.setId("ID_A"); member.setUsername("C"); em.persist(member); tx.commit(); }catch (Exception e){ tx.rollback(); }finally { em.close(); } emf.close(); }} persistence.xml <?xml version="1.0" encoding="UTF-8"?><persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"> <persistence-unit name="hello"> <properties> <!-- 필수 속성 --> <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> <property name="javax.persistence.jdbc.user" value="sa"/> <property name="javax.persistence.jdbc.password" value=""/> <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> <!-- 옵션 --> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.use_sql_comments" value="true"/> <property name="hibernate.hbm2ddl.auto" value="create" /> </properties> </persistence-unit></persistence>
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 id 값이 공유되는 문제
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] 안녕하세요 영한님 제가 JPA를 이용한 사이드 프로젝트를 진행중인데 한 가지 문제가 생겨서 질문드립니다. 현재 저는 oracle 을 사용하고 있으며, Member, Order, Store 등의 여러 엔티티들을 사용합니다. 모두 @GeneratedValue 로 선언한 상태입니다. 그런데 / GivenMember member = Member.builder().name("memberA").build();memberRepository.save(member);Store store = Store.builder().name("storeA").build();storeRepository.save(store);System.out.println(store.getId());Order order = Order.createOrder(member,store, OrderType.DELIVERY);orderRepository.save(order);System.out.println(order.getId()); 와 같이 테스트를 작성하면서, Member를 생성해서 save하면 memberId가 1이 되는데 그다음에 store를 save하면 서로 다른 테이블이기 때문에 1L이 되어야 하는데 2L이 됩니다. 물론 그다음 order는 3L이 되구요 모든 엔티티들이 hibernate_sequence를 공유하고 있고, save하는 과정에서 select hibernate_sequence.nextval from dual; 가 호출될 때마다 값이 1씩 증가하고 있는 것같습니다. 엔티티들이 sequence를 공유하지 않는 방법이 없을까요... 검색을 여러번 해보기도 했고, 검색 키워드를 못잡겠어서 질문드립니다 ㅠㅠ
-
미해결실전! 스프링 데이터 JPA
repository는 entity당 개별로 생성해줘야 하나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의내용을 보면 Member와 Team 엔티티가 있고 JpaRepository를 상속받은 repository 또한 각각 만들어져 있습니다. 단순한 조회는 이미 정의되어있는 메소드로 가능하지만, 다른 테이블(엔티티)와 조인하는 경우에는 직접 정의해서 사용 가능하다는 내용의 강의였는데요 그럼 만약 4개 5개 복잡한 엔티티들과 연관된 쿼리들을 정의하고 싶다면 어느 repositroy에 정의를 해야할지 고민입니다. 여러 엔티티를 1개의 repository로 관리하고자 해도, 상속받을때 <>속에 특정 엔티티를 넣어줘야하는데, 그럼 어떤 엔티티를 넣어야할까요? 코딩에 정답은 없겠지만은 실무에서는 관례쩍으로 어떤식으로 구현을 하는지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
대상 테이블에 외래키 의 단점
member table만 조회해서 locker값이 있는지 없는지를 모릅니다. 그래서 locker table까지 조회를 해야합니다. 그래서 지연로딩이 불가하고 즉시로딩만 됩니다. 그런데 이렇게 따지면 주테이블에 외래키를 넣어도 locker table만 조회해서는 member값이 있는지 없는지를 모르지 않나요? member table까지를 확인해봐야 아는거잖아요
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@joincolumn name 속성
1. team에서는 멤버변수가 member클래스고 joincolumn의 name속성은 team_id잖아요 @joincolumn(name = "team_id") private List<Member> members = new ArrayList<>(); 왜 member_id가 아니라 team_id인건가요?
-
미해결실전! 스프링 데이터 JPA
선생님 질문이 있습니다!
안녕하세요! 강의 재밌게 수강하고 있습니다! 실례가 안 된다면 혹시 선생님께서 말씀하시는 핵심 비즈니스 로직과 화면 혹은 API에 맞춘 로직의 차이점을 간단하게 설명해주실 수 있으실까요? 저는 화면에 출력하거나 API를 만드는 게 곧 핵심 비즈니스 로직이라고 생각했는데 제가 잘못 생각하고 있었던 거 같아 혹시 도움을 받을 수 있을까 하여 질문 남기게 됐습니다 ㅠ + Trade off는 어떤 의미로 이해하면 좋을까요? ㅠㅠ P.S 비전공자로 여러 강의를 들으면서 선생님 강의 만난 게 최고의 행복인 거 같습니다! 종종 PPL 하시는 JPA 책도 잘 읽고 있는데 언젠가 기회가 되면 선생님께 싸인 받고 싶습니다 ㅋㅋㅋ 존경합니다 선생님!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
maven이 아니라 gradle로 진행중이신 분들
```// maven 기준 > mvn spring-boot:run \ -Dspring-boot.run.jvmArguments='-Dserver-port=9003' // gradle 기준 (4.9 이상)> ./gradlew bootRun --args='--server.port=9003' // java jar 기준 > java -jar "-Dserver.port=9003" ./user-service.jar // 참고: gradle로 jar 만들려면.. > ./gradlew build //실행후 project의 최상단 디렉토리/build/libs에서 jar확인// gradle로 boot 실행하기> ./gradlew bootRun```알아서 잘 하시리라 생각되지만 조금이라도 시간절약이 되실까하여 올려봅니다
-
미해결실전! Querydsl
select절 서브쿼리 tuple에서 읽는방법
안녕하세요 영한님. 밑에 비슷한 질문이 있었는데 해결이 되지않아 질문드립니다. //모든이름과 평균나이 출력QMember memberSub = new QMember("memberSub");List<Tuple> result = queryFactory .select(member.username, JPAExpressions .select(memberSub.age.avg()) .from(memberSub) ) .from(member) .fetch();for (Tuple tuple : result) { System.out.println(tuple.get(member.username)); System.out.println(tuple.get(1, Double.class));} 강의에서 코드인데요 여기서 평균나이값을 tuple에서 뽑고싶어서 tuple.get(memberSub.age.avg()) 로 뽑아봤는데 값이 null이 나옵니다. 그래서 현재는 Index와 클래스로 뽑긴했는데 member.username처럼 바로뽑는법이 있을까요? 항상 감사합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
API Gateway와 웹 서버 차이
안녕하세요. API Gateway 공부하면서 간단한 질문이 있어 이렇게 올립니다. 라우팅 처리나 필터 처리하는 것이 웹서버의 역할과 크게 다르지 않아 보이는데 API Gateway와 웹서버(apache, nginx... ) 차이점이 어떻게 되는지 궁금합니다.
-
미해결실전! 스프링 데이터 JPA
entitygraph관련 궁금증
안녕하세요!! 만들어주신 로드맵을 열심히 공부하고 있는 학생입니다! @entityGraph와 관련하여 추가적인 궁금증이 있어 질문드립니다. 먼저 해당 내용에 대해 repository 내에서 findAll() 메소드를 상속받아, 여기에 fetch join을 부여해 주는 것으로 이해했는데요 혹시 이렇게 상속받으면 findAll 메소드 자체가 바로 fetch join을 진행하는것이 아닐까 해서요 예를 들어 A 위치에서는 member의 변수만을 필요로 하고, B 위치에서는 team까지 가져오려 하면 A에서는 LAZY로 유지되는 것이 좋고, B에서는 바로 fetch join하는 것이 나을 거라 생각하는데 위의 방식이면 둘 다 바로 fetch join을 진행할 것 같다고 생각하는데 이게 맞을까요?? 혹시 맞다면 어떤 식으로 고치는것이 더 최적화될지 궁금합니다.... --- 추가로 혹시 @entityGraph는 무조건 left outer join에서만 적용되는 것일까요??
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Order 생성 메서드
안녕하세요 Order 생성 메서드를 setter없이 작성해봤는데 올바르게 작성했는지 궁금해서 질문드립니다. 강의코드 /** * 생성 메서드 */public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) { Order order = new Order(); order.setMember(member); order.setDelivery(delivery); for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.setOrderDate(LocalDateTime.now()); return order;} 제가 작성한 setter를 사용하지 않은 생성 메서드 public Order(Member member, Delivery delivery, LocalDateTime orderDate, OrderStatus status) { this.member = member; this.delivery = delivery; this.orderDate = orderDate; this.status = status;}public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) { Order order = new Order(member, delivery, LocalDateTime.now(), OrderStatus.ORDER); for (OrderItem orderItem : orderItems) { order.orderItems.add(orderItem); } return order;} 이렇게 작성했습니다. 올바르게 작성했는지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
수업중 질문
안녕하세요 수업을 듣던 중 질문을 남깁니다. 값 타입 컬렉션은 불변객체로 사용하라하셔서 값 변경을 못한다고 알고있습니다. 그래서 Entity로 승격을하면 setter를 원래 두면 안되지만 두었다하고 값을 고치게 된다면 Address address = new Address("서울"); member1.getAddressHistory(address) member2.getAddressHistory(address) address.setCity("부산"); 위의 코드를 실행했을 때 서울의 값으로 들어가나요
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
member는 생성 메서드를 만들지 않은 이유가 있나요?
member는 생성 메서드를 따로 만들지 않고 그냥 MemberRepository에서 저장, 조회를 했는데 Order와 OrderItem에만 생성 메서드를 만들어줬나요? 단지 단순한 로직(다른 엔티티에서 값을 가져와서 처리하는 비즈리스 로직이 없어서)이라서 Member 엔티티는 생성 메서드를 만들어 주지 않은 건가요?
-
미해결실전! 스프링 데이터 JPA
@Path variable로 Id를 받을 때 궁금증
강의를 듣다가 궁금한게 생겼는데요 Id 같은 PK의 경우에 좀 중요한 정보라고 생각을 합니다. 사용자 입장에서는 자동적으로 매겨진 pk인 id를 모르겠지만 이것을 사용자 측에서 저장하고 server와 주고 받는것이 맞는건지 궁금합니다. 공부를 하는 입장이라 실무에서는 어떤 방식으로 사용자 정보를 조회하도록 하는지가 너무 궁금합니다. ID정도는 넘겨줘도 상관이 없는건가요? 아니면 이러한 정보를 절대 전송하면 안되고 매번 session에서 꺼내야 하는건가요? cookie 에서 이 값을 저장해도 무방한가요? 무엇이 나은가요? ㅠㅠ cooki Id
-
미해결
엔티티 매니저 없이도 DB 값 저장이 가능한건가요??
안녕하세요 영한님 강의로 JPA, SPRING DATA JPA 공부중인 초보 입니다 강의 하나를 완강했음에도 제가 아직 전반적인 구조에 대해서 이해를 못한건지 잘 이해가 안되는 부분이 있어서요.. 강의에서는 항상 엔티티 매니저를 통해 ~.persist() 로 DB에 저장을 해서 자연스럽게 저렇게 저장을 하는거구나 했는데 한 예제 프로젝트를 보니까 게시글 crud를 엔티티 매니저 일절 사용 없이 구현하더라구요 분명 스프링 데이터 JPA 를 이용한 예제인것 같은데 이게 원래 가능한걸까요?? 가능하다면 엔티티 매니저는 왜쓰는지도 궁금합니다 검색해봐도 감이 잘 안잡혀서요 ㅠㅠ 영한님 강의 레포지토리 예제 레포지토리
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
1:N관계인 경우 Join 유무
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]여기에 질문 내용을 남겨주세요. Team team = new Team(); team.setId(1L); team.setName("t1"); em.persist(team); Member mem1 = new Member(); mem1.setName("aaa"); mem1.setTeam(team); em.persist(mem1); Member mem2 = new Member(); mem2.setName("bbb"); mem2.setTeam(team); em.persist(mem2); Member mem3 = new Member(); mem3.setName("ccc"); mem3.setTeam(team); em.persist(mem3); em.clear(); em.flush(); // Team newTeam = em.find(Team.class, 1L); // System.out.println(newTeam.toString()); // List<Member> ML = newTeam.getMembers(); // System.out.println("test:"+ML.get(0).getName()); Member newMember = em.find(Member.class, 1L); System.out.println("test:"+newMember.getTeam().getName()); tx.commit(); 1:N관계인 Team Member를 DB에서 가져올때 서로 양방향 연관관계인 경우 Team에서는 join없이 2번의 쿼리를 날려서 조회하고Member에서는 외래키를 사용하여 join문으로 1번의 쿼리로 조회를 하더라구요.혹시 이 두가지가 왜 이런 차이가 나는지 알 수 있을까요? Team에서 Member를 가져올때 충분히 기본키를 활용하여 가져올 수 있을텐데요
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
FK를 조합한 복합식별자를 사용하는 경우에는 Entity를 어떻게 해야할까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 현재 도메인 설계중이고 다음과 같이 단일 주 식별자 값 없이 두 개의 외례키를 조합하여 식별자로 사용하고자 합니다. 테이블에서 자주 사용되는 컬럼값인 id, createdAt, updatedAt, status를 아래와 같이 BaseEntity 클래스에 묶어서 관리하고 있습니다. @MappedSuperclass @Getter public abstract class BaseEntity implements Serializable { @Id @GeneratedValue private Long id; @CreatedDate private LocalDateTime createdAt; @LastModifiedDate private LocalDateTime updatedAt; @Column(length = 10) @Value("ACTIVE") private String status; public BaseEntity(LocalDateTime createdAt, LocalDateTime updatedAt) { this.createdAt = createdAt; this.updatedAt = updatedAt; } protected BaseEntity() {} } 만약 처음 테이블 설계와 같이 외례키를 조합하여 테이블을 관리하게 되면 Entity does not have primary key라는 경고 메시지가 발생합니다. 여기서 BaseEntity를 상속받는 다면 기본 키도 같이 상속받기 때문에 경고 메시지는 사라지지만 ERD와 달리 기본 키를 갖게 됩니다. ERD 설계와 같이 외례키 조합만으로 도메인을 구성할 수 있는 방법이 있을까요? 혹은 위의 ERD를 수정하여 group_member_id 기본키를 넣어주는 편이 더 좋은 설계인것인지 궁금합니다.
-
미해결
JPA의 DB조회에 대해서 질문드립니다.
안녕하세요. 스프링JPA로 블로그 게시판을 만들고 있습니다. 복잡한 기능 말고 게시판만 하나 만들어 보고 심층공부를 들어갈려고 하는중입니다. -------------------------------------------------------------------------------------------------------------------- 일단 DB는 이렇게 구성돼 있고 BLOGLIST로 게시판 목록을 관리하기 위해 BLOG_NUM에 외래키를 주고 테이블을 따로 만들어서 조인했습니다. -------------------------------------------------------------------------------------------------------------------- 그리고 엔티티를 각각 만들고 다대일 연결까지 성공해서 데이터 조회까지 됩니다. @Entity(name = "BLOG") @Getter @Setter @ToString @RequiredArgsConstructor public class Blog { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="CON_NUM") private Integer con_num; @ManyToOne @JoinColumn(name = "BLOG_NUM", referencedColumnName = "BLOG_NUM") //referencedColumnName = "BLOG_NUM"~~ 은 어떤 컬럼과 연결이 됐는지 지정. private BlogList blogObj; @Column(name="CON_TITLE") private String title; @Column(name="CON_CONTENT") private String content; @Column(name ="CON_WRITEDATE") private Date writeDate; } @Entity(name = "BLOGLIST") @Getter @Setter @ToString @RequiredArgsConstructor public class BlogList { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "BLOG_NUM") private Integer blogNum; @Column(name = "BLOG_NAME") private String blogName; } ---------------------------------------------------------------------------------------------------------------------- 이런식으로 BLOGLIST테이블의 항목까지 출력을 할 수 있었습니다. 여기서부터 문제입니다. SELECT * FROM BLOG WHERE=BLOG_NUM=? 이러한 쿼리를 실행시켜서 블로그의 메뉴에서 각각의 항목을 눌렀을 때 각각의 내용을 출력하려고 합니다. ------------------------------------------------------------ 그래서 제가 시도한것은 1. 레파지토리에서 아래 주석된 메소드로 조회메소드를 만들고 public interface BlogRepository extends JpaRepository<Blog, Integer>{ List<Blog> findByTitleContaining(String searchWord); //List<Blog> findByBlogObj(Integer blogNum); } 컨트롤러에서 이런식으로 조회를 시도 해보았으나 잘 되지 않았습니다. // 게시판별 리스트 @GetMapping("/contest") public String testList(Integer blogNum, Model model){ model.addAttribute("list", blogRepository.findByBlogObj(blogNum)); return "/layouts/conList"; } ---------------------------------------------------------- 그래서 2번으로 시도한 것이 리파지토리에 쿼리 직접 넣는 것이었습니다. @Query(value = "SELECT * FROM BLOG B WHERE B.BLOG_NUM = ?", nativeQuery = true) //true는 SQL, false는 JPQLList<Blog> findAllByBlogNum(Integer BlogNum); @GetMapping("test")public String findBlog(Integer BlogNum, Model model){ System.out.println("파람:" + BlogNum); List<Blog> blog = blogRepository.findByBlogObj(BlogNum); model.addAttribute(blog); return "/layouts/conList";} 이 방식은 이렇게 파라미터를 보냈으나 Null값이 뜨고 파라미터를 가져오지 못하네요. ------------------------------- 아무래도 엔티티 설계에 제가 이해가 부족해서 그런것 같은데 엔티티에 어느 부분을 손을 보아야 제가 원하는 조회를 할수 있을까요?