묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Order와 OrderItem의 관계
Order와 OrderItem의 연관관계 메서드를 Many인 OrderItem에 해야 하는거 아닌가요? 이유가 따로 있을까요? 이렇게 하는걸 추천하셨는데 궁금합니다!!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
트랜잭션 조회전용 코드 질문
안녕하세요~ 궁금해서 질문드립니다. 만약에 em.find(xxx.class, id) 또는 em.createQuery("select ...") 와 같이 조회 전용으로만 사용할 꺼라도 트랜잭션(tx.begin ~ tx.commit)안 에서만 해당 코드를 사용해야 하나요? (트랜잭션 코드 없이 그냥 조회해도 데이터는 조회가 되긴하던데...) 왠지 모든 JPA관련 코드는 트랜잭션안에서 실행을 해야 할꺼 같은 생각이 들어서 질문드립니다. 감사합니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
하이버네이트 프록시 참조 가능
https://www.inflearn.com/questions/53733 우선 위의 글을 읽고 왔습니다. 트랜잭션을 종료하지 않은 상태에서 em을 닫았기 때문에 아직 트랜잭션이 살아있어서 값이 잘 불러와진다고 하셨습니다. 제 build.gradle의 하이버네이트 버전은 다음과 같이 설정되어있습니다. 그리고 제가 다음과 같이 코드를 작성했습니다. 그런데도 여전히 값이 잘 불러와집니다. 이 부분은 어떻게 이해해야 하나요?(하이버네이트 버전을 5.4.0으로 해도 값이 잘 참조가 되더라구요.)
-
미해결실전! Querydsl
db에 날리는 쿼리는 최대한 간단하게 하라는 의미
안녕하세요, 영한님. 저는 jpa기초부터 지금까지 쭉 잘 듣고있는 수강생입니다. 지금 이 강의는 아니고, 이전? 강의에서 흘러가는 말로, 보통 query로 데이터를 갖고 올 때는, 가능한 한, 단순한 쿼리로 raw 데이터 위주로 갖고오고, 비즈니스로직은 애플리케이션 단에서 코드로 처리한다고 하셨는데,(설령 avg, sum 등 db 에서 연산 가능한 부분이더라도요..) 혹시 그렇게 했을 때 이점이 어떤게 있어서 그런건가요? 예전에, raw data만 sql로 갖고와서, sum, avg 를 컨트롤러 단에서 구현한 적이 있었는데, 당시 사수는 db 에서 가능한 한 연산을 많이 해서 갖고오라고 말씀해주셨는데, 견해가 또 다르신거같아서 여쭤봅니다. 당시에는 유저별 랭킹 시스템을 합산하기 위한 개발이었습니다.(24시간 배치로 돌아가는 프로그램이었죠.)
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
Jpql질문
Jpql, querydsl 을 사용하면 좋다고 하셨는데 운영시에나 개발시에나 모든 상황에 결국 데이터가 안맞는 것은 대부분이 쿼리가 잘못돼서 그렇더라구요 이때 마이바티스 같이 네이티브 쿼리로 작성된 쿼리를 보고 뭐가 문제인지 판단해야 하는데 오히려 네이티브 쿼리 보는게 jpql, querydsl 보는 것 보다 쉽지 않나요? ----- 조금이라도 복잡한 쿼리라면 결국 네이티브 sql을 직접 작성하면서 데이터를 맞춰가면서개발하게 되는데 jpa를 사용하면 네이티브 쿼리로 테스트 하면서 작성된 쿼리를 다시 jpql이나 querydsl로 바꾸는 과정이 필요할 것 같아서 불편해 보이는데 어떤가요? --- 즉 jpa보다 마니바티스가 좋다고 생각되는 부분은 1.마이바티스를 사용하면 쿼리를 보자마 판단하기 쉽다. 쿼리를 돌려보려면 결국 애플이케이션을 실행해야 jpql이나 querydsl의 쿼리결과를 볼 수가 있다는거죠 2. 테스트하며 쿼리 작성 후 jpql 맟 querydsl로 변환이 필요없고 바로 파라미터 문법만 바꿔서 복붙하면 된다 Jpa가 객체지향을 위한 건 알지만 실무에서 저런 단점들이 유지보수에 엄청 안좋을 것 같은데 어떻게 생각하시는지 궁금합니다 Jpql을 보니 문득 의문이 들었어요 감사합니다!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요 ! Fetch = LAZY 에 관해서 질문남깁니다.
안녕하세요~ LAZY 관련 질문이 있어서 글을 남깁니다! LAZY 로드를 디폴트로 설정하기 위해서 propertis or yml 파일에 "spring.datasource.jpa.hibernate.enable_lazy_load_no_trans"=true 구문을 추가 하였습니다. 적용한 자바 config 파일 입니다. properties.setProperty("hibernate.enable_lazy_load_no_trans", env.getProperty("spring.datasource.jpa.hibernate.enable_lazy_load_no_trans")); 혹시 해당 프로펄티즈 구문으로 Lazy를 디폴트로 설정해본 적이 있으신가요? 매우 간편 해보여서 프로젝트에 적용해서 쓰고 있는데 안티 패턴이여서 쓰지 말라는 글도 있더라구요. 해당 설정에 대해서 김영한 개발자님의 의견이 궁금합니다! https://vladmihalcea.com/the-hibernate-enable_lazy_load_no_trans-anti-pattern/
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
질문있습니다.
안녕하세요. 기본적인 내용이라 질문 드리긴 부끄럽지만 헷갈리는 부분이 있어서 질문드립니다.. em.find(Member.class, member.getId()) 를 할 때입니다. Identity 전략을 사용하면, member.setUsername(" ")만 해주고 em.persist(member)를 하게 되면, DB로 쿼리가 날라가서 id를 얻어온 후 1차 캐시에 member를 구분할 식별자인 id와 member 정보들이 저장되어 있는 것을 이해했습니다. 그러면 persist를 하면서 1차 캐시에 id와 member가 저장이 된 상태일 텐데, 영속 컨텍스트를 초기화하는 작업 후에 프록시 객체를 불러오는 작업을 합니다. 이 때 member의 id를 알려면 DB로 find 쿼리가 날아가야 하지 않나요? 제가 아리송했던 부분은 10분 40초쯤에, flush로 인해 쓰기지연 저장소에 담겨있던 insert 쿼리가 날아가고, em.clear로 1차캐시를 비워준 상태입니다. 이 상황에서 1차 캐시가 비어있는데 어떻게 find query 없이 database를 타지않고 Id를 바로 받을 수 있는 것인지 의문이 생겼습니다. 레퍼런스를 찾을 때는 이미 id값을 파라미터로 넣어서, 값이 있기 때문에 터치를 안하고 DB쿼리가 필요 없다고 하셨는데 현재 Identity 전략이기에 DB를 거쳐야 ID를 알 수 있는 것이 아닌가요..? 어떻게 바로 member.getId()를 알 수 있는 것인지 궁금합니다.
-
해결됨실전! Querydsl
EntityManager 관련 질문
안녕하세요 강사님~ 강의 재미있게 보고있습니다. 강의 마지막쯤 스프링에서 주입해주는 엔티티매니저는 동시성문제 없이 동작한다고 설명 해주셨는데 JPAQueryFactory를 Bean으로 등록하거나 상위 클래스 생성자에서 미리 할당하고 사용해도 문제가 없는지 궁금합니다. 또 현업에서도 예제처럼 querydsl을 사용 할 때마다 JPAQueryFactory를 할당해서 사용 하시는지도 궁금합니다.
-
해결됨실전! Querydsl
MappedBy 와 @Setter 관련 질문
안녕하세요! 강사님 강의를 듣다 궁금한게 있어서 질문 남깁니다. 1. 강의 초반 @Setter는 현업에서 가급적 사용하지 않는다고 하셨는데 그 이유에 대해서 좀 더 자세히 알 수 있을까요? 2. mappedBy = "team" 이렇게 설정 해주셨는데 연관관계 주인의 클래스명을 소문자로 적어주면 되는건가요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티매니저팩토리 cloase 질문
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");EntityManager em = emf.createEntityManager();EntityTransaction tm = em.getTransaction();tm.begin();try { Member findMember = em.find(Member.class, 1L); findMember.setName("HelloJPA"); tm.commit();} catch (Exception e) { tm.rollback();} finally { em.close();}emf.close(); 여기서 emf도 finally에 들어가도 되는거 아닌가요? 꼭 밖에 선언한 이유가 있을까요?
-
해결됨실전! Querydsl
dto
활용편에서 dto로 리턴해야 하는 중요성을 배웠었는데요. dto클래스를 꼭 요청에 필요한 필드로만 구성해야 하나요? 어떤곳은 username만, 어떤곳은 age 또는 2개다 이렇게 하나의 엔티티에서 여러개의 dto를 만들면 이름짓기도 애매할텐데 엔티티랑 똑같이 dto를 만들고 필요한것만 생성자나 set하고 나머지는 null로 응답하면 문제가 있을까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
컨트롤러에서 레파지토리 호출시 트랜잭션은?
안녕하세요~ 잘듣고 있습니다. 근데, 궁금한게 있어서요. 만약 컨트롤러에서 바로 (서비스 없이) 레파지토리를 호출하면 기존에 서비스에서 하던 트랜잭션 처리를 컨트롤러에서 해야 하는건가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
캐시란?
안녕하세요 선생님, 명강의 늘 감사드립니다.바로 본론으로 들어가겠습니다. 질문 내용은 다음과 같습니다. 16:47에서 말씀하시는 캐싱이라는 뜻에 대한 상세한 개념을 정리하고자 질문을 드립니다.캐시의 추상적인 개념은 나중에 요청을 결과를 미리 저장해두었다가 빠르게 서비스를 해준다는 의미로 인지하고 있습니다. 1. 컴퓨터 자체에서의 캐시 메모리에 캐싱한다는 것인지, DB 자체에서 내부적인 캐시에 데이터를 캐싱? (데이터를 가지고 있다) 한다는 의미인지 궁금합니다. 2. 만약 DB 자체에서의 캐쉬라면 DB의 캐시와 컴퓨터의 캐시 메모리의 차이점이 무엇인지 궁금합니다. 예를 들어 DB 자체의 캐시란 요청을 결괏값을 컴퓨터 캐시 메모리에 올려놓고 트랜잭션이 완료되기 전에 재사용하는 의미인지 궁금합니다. 3. 일반적으로 알고 있는 웹서비스의 구조는 다음과 같습니다. 일반적으로 마이바티스를 사용할 경우 다음과 같은 구조가 된다고 알고 있습니다. [Look aside cache] jpa를 사용하면 다음과 같은 구조가 되나요?감사합니다. 출처 : https://www.youtube.com/watch?v=mPB2CZiAkKM
-
미해결실전! Querydsl
Case 문
OrderBy에도 사용 못하는건가요? @Testvoid complexCase() { List<Member> result = queryFactory .selectFrom(member) .orderBy(new CaseBuilder() .when(member.age.eq(10)).then(1) .when(member.age.eq(20)).then(2) .otherwise(3)) .fetch();} 빨간줄이 막뜨더라구요..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
change 언급하실때
itemService 에서 change 메서드 호출해서 넣어주고, Book 엔티티 쪽에서 change 메서드를 만들어주었습니다. 기능은 정상 동작하나, 이게 최적된 방법인지는 잘 모르겠습니다. 강사님이 말씀하신 변경감지를 이용한 부분인데, 컨펌한번 받아보고자 이렇게 올렸습니다. 조언부탁드립니다 . 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
spring-boot-devtools 사용시 recompile하면 서버가 재시작되나요?
안녕하세요, html 파일 수정시 ctrl + shift + f9 단축키로 recompile하면 서버 재시작 없이 변경사항이 적용 되는줄 알았는데 리컴파일 할때마다 서버자체가 재시작 되면서 데이터베이스의 테이블도 다 드랍했다 생성합니다. ddl-auto: create으로 해놓긴 했지만 리컴파일 할때 서버 재시작이 안되고 반영되는줄 알았는데 무조건 서버 재시작이 되는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
book 객체가 왜 준영속인것인가
수정을 시도하는 Book객체는 새로 만들어진것이잖아요 강사님. 이 Book객체는 이미 DB에 한번 저장이 되었다고 했는데 persist를 한적도 없고 db를 통해 find 한 객체도 아닌데 어떻게 이게 준영속 객체가 되는것이지요?????? 단지 그냥 Book이란 객체를 만들고 set으로 평범한 값을 넣어줬을 뿐인데.. 만약 set을 하고 em.persist(book) 을 해주면 뭐 영속성컨텍스트에 올라갈것이지만요... 그냥 book은 단순 객체가 아닌 이유를 이해하기가 정말 어렵습니다.ㅠ 기존식별자를 가지면 준영속이라고 하셨는데 book에 set을하여 id를 박는순간 이것은 준영속인것인가요? id는 식별자니까요 @PostMapping("items/{itemId}/edit")public String updateItem(@ModelAttribute("form") BookForm form, @PathVariable String itemId) { Book book = new Book(); book.setIsbn(form.getIsbn()); book.setAuthor(form.getAuthor()); book.setStockQuantity(form.getStockQuantity()); book.setPrice(form.getPrice()); book.setName(form.getName()); book.setId(form.getId()); itemService.saveItem(book); return "redirect:/items";}
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
썜. updateItemForm에는 action이 왜 없나요
@GetMapping("items/{itemId}/edit")public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) { Book item = (Book) itemService.findOnd(itemId); model.addAttribute("form", item); return "items/updateItemForm";} 수정버튼 눌렀을경우 바로 이렇게 item을 때려 박아서 정보를 줘도 되지않나요. 왜 폼에 넣고 폼을 전달하나요 아참. 이게 본 질문입니다. action이 없어도 되는건가요? method는 있네요. <!DOCTYPE HTML><html xmlns:th="http://www.thymeleaf.org"><head th:replace="fragments/header :: header"/><body><div class="container"> <div th:replace="fragments/bodyHeader :: bodyHeader"/> <form th:object="${form}" method="post"> <!-- id --> <input type="hidden" th:field="*{id}"/> <div class="form-group"> <label th:for="name">상품명</label> <input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요"/> </div> <div class="form-group"> <label th:for="price">가격</label> <input type="number" th:field="*{price}" class="form-control" placeholder="가격을 입력하세요"/> </div> <div class="form-group"> <label th:for="stockQuantity">수량</label> <input type="number" th:field="*{stockQuantity}" class="formcontrol" placeholder="수량을 입력하세요"/> </div> <div class="form-group"> <label th:for="author">저자</label> <input type="text" th:field="*{author}" class="form-control" placeholder="저자를 입력하세요"/> </div> <div class="form-group"> <label th:for="isbn">ISBN</label> <input type="text" th:field="*{isbn}" class="form-control" placeholder="ISBN을 입력하세요"/> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> <div th:replace="fragments/footer :: footer"/></div> <!-- /container --></body></html>
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문취소시 영속성 컨텍스트
썜. //주문취소order.cancel(); 을 했을경우. 카운트만 바꾸었지 persist를 한적이 없잖아요? 그상태로 @Transactional때문에 commit이 날라가게 될텐데 어떻게 카운트 값이 db에 번복되어 저장되는것이죠? 고비 같군요 지금이..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
왜 Transactional을 service에 두나요
영한 쌤!!! @Transactional을 Service에 말고 Repository에 달면 안되나요? 그리고 @Transactional 은 Test 폴더 안에서만 rollback을 시키는건가요? 아니면 SpringBootTest 어노테이션 안에서만 rollback 이 되는건가요?