묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
dto 로 변환 단계에 대해 질문드립니다!
안녕하세요! entity를 dto로 변환하는게 좋다 하셨는데 repository에서 service로 넘겨줄때 dto를 넘기는게 맞나요 아니면 repository에서는 entity를 넘겨주고 service에서 controller로 넘겨줄때 dto로 변환해서 넘겨주는게 맞나요??
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
item 엔티티 설계
package hello.upload.domain;import lombok.Data;import java.util.List;@Datapublic class Item { private Long id; private String itemName; private UploadFile attachFile; private List<UploadFile> imageFiles;} 메모리에 저장하는 도메인은 위와 같은데, jpa 엔티티 설계시 uploadFile은 값 타입으로 하는게 좋을까요? 그러면 imageFile와 같은 값 타입을 List 형식으로 선언해도 되나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
spring.jpa.open-in-view is enabled by default
- spring.jpa.open-in-view is enabled by default 전체 프로젝트 빌드 및 실행은 정상적으로 동작합니다. 그런데, console에서 spring.jpa.open-in-view is enabled by default 라는 문구를 발견하게 되었습니다. 구글링을 통해 검색하니, 어떤 분들은 default로 지정된 true 값을 false로 변경해야 성능에 좋다고 하시는데,.,, 자세히 알지 못하여 질문 남깁니다. default 값인 true로 나둬야 할지, 아니면 false로 변경해야 할지 궁금합니다!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
프록시 객체 초기화 중 질문있습니다.
안녕하세요 영한님! 강의 내용 중 궁금한 점이 있어 질문 드립니다. Team refTeam = em.getReference(Team.class, 1L);refTeam.getName(); 을 하게되면 Proxy가 비어있으므로 1. 영속성 컨텍스트에 초기화 요청을 보내고, 2. 영속성 컨텍스트가 DB를 조회해 3. 실제 엔티티 객체를 생성 은 이해가 되었습니다. 그럼 여기서 영속성 컨텍스트가 실제 엔티티 객체를 생성하고 Proxy의 target에 연결을 해줄 뿐이지, 1차 캐시에 실제 엔티티가 저장되는 것은 아닌 건가요? 1차 캐시에는 'Proxy 객체만' 있고 Proxy의 target을 통해 실제 엔티티를 접근할 수 있는 건지 궁금하여 질문 드립니다! 감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티와 컬럼 생성 기준
안녕하세요. 연관관계 주인이 아닌 List로 구현된 members에서 궁금한 점이 있습니다. 먼저 지금까지 이해한 바로는, @Entity 애노테이션과 ddl-auto 속성에 의해서 @Entity를 가진 클래스의 필드들이 해당 테이블의 attribute로 만들어지는 것으로 이해했습니다. 1. @Column이 DB 테이블의 실제 컬럼 이름과 매핑을 짓는 용도라고 이해했는데 @Column을 생략해도 DB상에 해당 컬럼이 생성된 것을 확인했습니다. 이 경우, 컬럼은 생성됐지만 매핑은 이루어지지 않은건가요? 2. Team 클래스의 members 어레이리스트는 Team 테이블의 attribute로 등록되지 않는 이유가 뭔가요? 물론, 데이터베이스 상에서 하나의 attribute에 하나의 값을 가져야 하는건 맞지만 이게 컬렉션으로 구현된 필드는 JPA에서 자동으로 attribute이 아니라고 인식하는 건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 메서드 질문입니다!
강사님 Order클래스에서 연관관계 메서드를 만드실 때 Member에 대한 연관관계 메서드의 경우 public void setMember(Member member)라고 하셨는데 그 이전에 lombok으로 이미 setter를 만들어 주셨는데 그렇게 되면 lombok으로 만든 setter는 연관관계 메서드에 의해 무시가 되는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
form tag중 action에서 질문이 있습니다.
회원 등록시 html form에는 action="/members/new"로 되어있는데 <form role="form" action="/members/new" th:object="${memberForm}" method="post"> --- 새로운 아이템 등록시 html form에는 action="@{/items/movie/new}"로 되어있습니다. <form th:action="@{/items/movie/new}" th:object="${form}" method="post"> 이 '{@"" }'의 차이가 뭔지 왜 빼거나 넣으면 작동이 안되는지 이유와 역활을 알려주시면 감사하겠습니다.
-
미해결실전! 스프링 데이터 JPA
totalCount는 어디서 쓰이나요?
페이징하면 제일 먼저 생각나는게 영한님이 말씀하신것 처럼 게시판의 페이징 기능이 생각이 납니다. Member가 m1~m5까지 있을때 이름, 나이 m1 AAA 10 m2 BBB 10 m3 CCC 10 m4 DDD 10 m5 EEE 10 이렇게 나이는 동일하고 이름만 다른 조건이 있다고 했을 경우 강의에서 offset과 limit을 활용하여 3개씩 잘라서 1 page = m1,m2,m3 2page = m4,m5 이렇게 나누는것 까지는 잘 이해가 됐습니다. 하지만 이때 totalCount는 강의내용을 참고하면 age가 같은 사람의 개수이니 5 라는 숫자가 나오게 되는데요 이 totalCount는 어디서 쓰이는건가요? 제가 생각하는 페이징에는 offset과 limit만 있어도 게시글 다음페이지 이런걸 할 수 있을거 같은데 어디서 쓰이는지 궁금합니다 ㅎㅎ
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Order의 PK에 따른 find()
안녕하세요 강사님! 다대다 강의를 보던 중, 다대다를 일대다-다대일 관계로 풀어내고, 연결테이블을 엔티티로 승격하라고 하셨습니다. 여기서, 연결테이블의 PK를 의미없는 값이 아닌, (member_id, product_id)로 가져가게 된다면 em.find(Order.class, [ A ]) 위 메서드를 사용할 수 없고 JPQL을 통해 조회를 해야하나요?? 그렇지 않고 find를 사용할 수 있다면 [ A ] 부분에 어떻게 들어가야하는지 문득 궁금해져서 질문 드립니다!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
4분 20초쯤 @JoinColumn
언제나 좋은 강의 감사합니다 영한님! 4분 20초쯤 @JoinColumn 을 넣지 않으면 default 값이 들어가는데 default 값이 지저분해서 넣어주는 것을 권장한다 라고 말씀하셨는데, default값을 확인해보고 싶어서 넣지 않아봤더니 Member 테이블에 LOCKER_ID 라는 컬럼이 추가되는 것을 확인하였습니다. 영상에서의 하이버네이트 버전과 제가 쓰는 하이버네이트 버전이 달라서인지는 모르겠지만 굉장히 직관적인 이름처럼 보이는데 생략하고 사용해도 상관이없을지, 아니면 다른 부분에서 문제가 될 만한 부분이 있는건지 궁금합니다.
-
미해결실전! Querydsl
EntityManager thread-safe 문제
안녕하세요 영한님 !! EntityManager 생성시에, final로 주입받으시거나 @PersistenceContext를 사용해서 주입받으시거나 둘 중에 하나로 코드를 작성하시는 것을 보았는데요!! 제가 알기로는 Entitymanager의 thread-safe하지 않은 문제를 해결하기위해서 @PersistenceContext를 사용하여 프록시 객체로 감싸서 생성함으로써 thread-safe하지 않은 문제를 해결해준다고 알고있었는데요, 그렇다면 final로 주입시에는 프록시 객체로 감싸서 주입받는게 아닌, 진짜 bean을 주입 받기 때문에 thread-safe하지 않다고 봐야할까요?? 감사합니다!! :)
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
jpa 숙련도 향상 관련
영한님이 조언해주신 것 처럼 Spring data jpa 익히기 전에 JPA 먼저 제대로 숙지하고 넘어가고자 하는데요. 강의에서 빠른 수업 진행을 위해 간략히 구성한것들 full로 구현해보는 것 외에 추가적으로 학습하기 좋은 방법이 잇을까요? 개인적으로 공부하는거라 실무에 적용해 볼수가 없어 질문드립니다. 답변주시면 감사드리겠습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Enum 에서 코드 사용
강의 잘 듣고 있습니다. 저는 ENUM을 GUEST("USER000"), USER("USER010"), ADMIN("USER020"); 와 같이 사용하고 DB에는 "USER000"과 같은 코드 값을 저장합니다. 혹시 EnumType.STRING에서 저 코드 값을 DB에 넣도록 할 수 있을까요? toString()을 오버라이드 하면 가능 한지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 선생님 V2방식에대한 질문
회원등록 V2 방식을 그대로 사용하고 POSTMAN에서 POST방식으로 BODY안에 CreateMemberRequest 클래스의 필드와 같은값으로 데이터를 전송해봤습니다. 그런데 기본생성자가 없을경우에는 "org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class jpashops.ormonetwocombine.dto.RequestItemDto]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `jpashops.ormonetwocombine.dto.RequestItemDto` 포스트맨 에러입니다 이런 에러 구문이 나오더군요, 그런데 기본생성자를 CreateMemberRequest에 추가해주고 다시 Postman으로 전송하더니 잘되더군요, 받아온 JSON 데이터를 파싱하는데 기본생성자가 원래 필수인가요~?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대다, 다대다 Entity 설계 관련 질문드립니다.
안녕하세요, 선생님. 강의를 듣고 이제 첫 실전에 jpa를 사용하는데 Entity 설계 과정에 어려움이 있어서 질문드립니다. 다름이 아니라 제가 스프링 시큐리와 같이 회원과 권한의 테이블을 설계하려고 해서 조사를 해보니 https://github.com/zidol/springsecurity_jwt_mysql/blob/main/src/main/java/co/kr/nakdong/entity/author/User.java https://github.com/zidol/springsecurity_jwt_mysql/blob/main/src/main/java/co/kr/nakdong/entity/author/Authority.java 와 같은 구조 혹은 @ManyToMany(cascade=CascadeType.ALL) @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) private Set<Role> roles; 다대다 구조를 많이 사용하더라구요.. 위 코드의 User 와 Authority는 일대다 구조인데 강의때 배울때 연관관계 주인 설정이나 fetch 타입 설정이 다르고 일대다는 권장 하지 않으셔서 조금 혼동이 오더라구요.. 지 양하라는 말씀을 그대로 쓰는코드들도 꽤 있더라구요. 그래서 최대한 강의때 배운데로 해보려고 아래 스샷처럼 변경 해보았습니다. 위 ERD 이미지 처럼 Entity를 변경해보았습니다.(테이블명은 작업중이라 안맞습니다.) 로그인 시 User객체를 조회 하여 불러오는데 test 코드에서 UserRepository를 통해서 User를 불러오면 데이터를 잘 조회 합니다. 제가 로그인을 UsernamePasswordAuthenticationFilter를 상속받아 attemptAuthentication메소드를 재구현했는데 리턴하는 부분에서 could not initialize proxy - no Session 에러가발생하네요.. @SneakyThrows@Overridepublic Authentication attemptAuthentication( HttpServletRequest request, HttpServletResponse response) throws AuthenticationException{ UserLoginDto userLogin = objectMapper.readValue(request.getInputStream(), UserLoginDto.class); String requestURI = request.getRequestURI(); if(userLogin.getRefreshToken() == null) { UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( userLogin.getUsername(), userLogin.getPassword(), null ); // 에러 발생부분 return authenticationManager.authenticate(token);} 제가 뭘 잘못하고 있는지, 어떤걸 참고해야 하는지 알려주시면 알될까요?? 감사합니다. 좋은 하루되세요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
application.yml이 아닌 application.properties 쓰시는 분은 이거 쓰시면 됩니다!
스프링 생성시 버전이 높아 application.properties로 생성되시는 분은 yml쓰셔도 되고 아님 properties 파일에 밑에 복붙하시면 되세요! # H2 설정spring.datasource.url=jdbc:h2:tcp://localhost/~/jpashopspring.datasource.username=saspring.datasource.password=spring.datasource.driver-class-name=org.h2.Driver# JPA 설정spring.jpa.hibernate.ddl-auto=createspring.jpa.properties.hibernate.format_sql=true# Log 설정logging.level.org.hibernate.SQL=debuglogging.level.org.hibernate.type=trace
-
미해결실전! Querydsl
JPQL Concat 질문
안녕하세요 선생님! 수업 잘 듣고있습니다 : ) ! 질문이 있습니다. concat 문자열 합치기 처리는 JPQL 문에서 처리 하지 않고 entity column 값을 그대로 가져와서 자바에서도 합치는 처리가 가능할 것 같은데 보통은 어떻게 처리하는게 좋을까요? 저는 공부하면서 뭔가 JPA가 객체지향 SQL을 사용하기 때문에 가능한 데이터를 entity 에 맞춰 그대로 값을 가져오고 자바에서 객체지향처럼 조작해서 처리하는게 것이 재사용성이 있어서 좋다고 생각했는데 실무 경험이 많이 없어서 어떤 기준을 잡아야 할지 헷갈리네요!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
id값을 Long 타입으로 지정하는 이유가 따로 있나요??
강의를 보면서 계속 궁금했던 건데 id 값을 int가 아닌 Long 타입으로 하는 이유가 뭔지 궁금합니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Enum 관련 질문드립니다.
아무래도JPA 보다는 DB쪽 질문에 가까운거같은데 이해해주시면 감사합니다. Enum이라는게 결국 어떤 카테고리의 역할을 할때가 많은거같은데요 이런경우 보통 인덱스를 걸어주는게 맞나요? db이론상으론 카디널리티가 낮은경우 인덱스를 걸면 효과가 적다고 해서 좀 혼란스럽더라구요. 그리고 강의중간에 말씀하신걸로 보면 그냥 String 형태로 저장해도 된다고 하고 차이가 적다구 하셨긴했는데 카테고리 역할을 할때 의 컬럼이 조건식도 그렇고 많이 쓰이는거 같아서 String비교보단 int비교가 빠르지 않나? 라는 생각이 좀 들었어서 혹시 int값을 주고 다른테이블로 외래키를 연결해서 id값과 String값을 주고 이어준다던가 이럴 필요는 없다고 생각해도 될까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
데이터뻥튀기, n+1 질문..
1) N+1 문제는 1의 쿼리를날렷을시 N방의 쿼리가 나가는것이고, 데이터 뻥튀기는 중복값이 나오는 거라고 이해하고있는데요 이둘은 다른 의미라고 봐도되는건가요? 2)N+1 문제에서 맴버와, 팀 LAZY 설정, N:1 관계라고 한다면요~ 초기셋팅 Team teamA = new Team();teamA.setName("teamA");em.persist(teamA);Team teamB = new Team();teamB.setName("teamB");em.persist(teamB);Member member = new Member();member.setName("김A");member.changeTeam(teamA);Member member5 = new Member();member5.setName("홍A");member5.changeTeam(teamA);Member member1 = new Member();member1.setName("정B");member1.changeTeam(teamB);Member member2 = new Member();member2.setName("진B");member2.changeTeam(teamB);em.persist(member);em.persist(member1);em.persist(member2);em.persist(member5); List<Member> resultList = em.createQuery("select m from Member m join m.team", Member.class).getResultList(); for (Member memberOne : resultList) { System.out.println(memberOne.getTeam().getName()); } 맴버에관한 쿼리 1방. 팀에대한 쿼리 두방이 나갈거같습니다.. 이런경우가 N+1 이고 데이터 뻥튀기는 없다. 라고 봐도될까요? 3) 이번엔 2번문제의 반대인데요~ 조건은같구요 List<Team> result = em.createQuery("select t from Team t join t.members", Team.class).getResultList(); for (Team team : result) { System.out.println("team = " + team.getName()); for(Member members : team.getMembers()){ System.out.println("members = " + members.getName()); } } 이런경우는 팀에관한 쿼리 한방, 맴버의 이름 2방이 나가니, N+1 이고 , 데이터 뻥튀기가 발생한다가 맞을까요 몇일째 N+1과 데이터 뻥튀기에대해 강의도 다시듣고 , 찾아보고하지만 머리 뇌리속에 안박히네요..