묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderService테스트 질문
안녕하세요 OrderService 테스트 시 회원을 createMember()직접 만들어서 사용했는데 회원가입 기능인 join을 사용하게 되면 해당 테스트에 필요없는 join 기능이 들어가게 되므로 createMember()처럼 하는게 좋은 것 같은데 맞을까요? 즉, 의미없는 의존은 하지 않는게 좋은 테스트 같거든요. 통합테스트 보다 단위테스트가 중요하다고 하신 것도 필요없는 의존성을 제외하기 위함도 있는 것 같구요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Transactional
@Transactional은 기본편에서 나오는 엔티티 매니저의 tx.begin() -> tx.commit의 역할과 같은 건가요?즉, 필수로 @Transactional이 있어야만 하나요? 없어도 되는걸로 알고 있어서요
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
ID가 없는 엔티티 만들 수 있나요?
JPA에서는 기본키를 무조건 가져야 한다는 전제 조건이 달려있더라고요. 스택 오버 플로에서도https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#No_Primary_Key이곳을 참조하라고 알려줍니다. 만약 로그를 쌓는 테이블이 밑의 형식이라면 스프링에서는 어떻게 구현해야 할까요?String Engine;int Tempeture;Date checkTime; 디비쪽 컬럼을 추가 할 수 없다면 어떻게 모델을 설계하면 될지 잘 모르겠습니다.마지막으로 이런 고민(디비 중심적 모델 설계?)을 현업에서도 많이 하시나요? 너무 부질 없는 고집 부리는거 아닌가 하는 생각이 많이 듭니다.
-
미해결실전! 스프링 부트와 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";}