묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
값 타입이라는건 결국 엔티티 객체 안에 포함된다 라고 생각해도 될까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. JPA에는 두가지 데이터 타입 (엔티티,값타입)이 존재한다고 하셧는데 값 타입의 설명을 들어보면 뭔가 자바에서의 primitive type이나 객체들의 이야기랑 많이 비슷한거 같아서요 , 제가 당장 이해한 바로는 엔티티 객체 안에 여러 값타입이 존재한다 라고 생각이 되는데 제가 올바르게 이해하고 있는지 궁금합니다..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
환경 세팅 질문입니다.
안녕하세요. 강의에서 보여주셨던 것과는 start.spring.io 의 화면이 달라서, 강의를 따라가기 위해서는 어떻게 선택해야 하는지 여쭙고자 합니다.Project에서는 Gradle-Groovy를 사용하면 되는건가요?Spring Boot는 3.0.5로 해야할까요 2.7.10으로 해야 할까요java버전은 17이 좋을까요 11이 좋을까요? 버전에 따라 dependencies가 먹히거나 안먹히거나 하는거 같습니다.답변에 미리 감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
쿼리 최적화 관련 (직접 쿼리날리기, 엔티티를 통한 접근)
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.특정 엔티티에 접근을 하려고 할 때 1)직접 쿼리를 통해 접근 하는 방법, 2) 엔티티와 자바 메소드를 통해 접근하는 방법 중 어떤 것을 선택해야할까요?예를 들어 User엔티티와 Follow엔티티가 1대N으로 설정되어있다고 가정한다면. user.getFollows()를 한다면 Select 쿼리가 한 번 더 나가게됩니다. 이것도 user를 repository에서 가져올때 follows를 join fetch 해온다면 괜찮지만insert또는 delete할 때가 고민입니다Insert일 때1) cascade타입을 persist또는 all로 설정해둔다면user.getFollows.add(follow) 쿼리로 할 수 있습니다하지만 이렇다면 Select문, Insert문 쿼리가 두번이 추가가 됩니다2)하지만 followRepository.save(follow)를 한다면 insert문 한 번의 쿼리만 나가게 됩니다.delete일 떄1)user.getFollows.delete(follow)또한 Select문, delete문 두번의 쿼리가 나가지만2)followRepository.delete(follow)는 한 번의 쿼리가 나갑니다. 하지만 이마저도 이전에 follow를 검색하는 과정에서 쿼리가 더 나갈 수 있습니다ex) User user = userRepository.findByUserId(userId);Follow follow = user.get~~; // 삭제할 follow를 구별해내는 메소드user.getFollows.delete(follow)-> 쿼리가 총 4번이 나갈 수 있습니다하지만 이걸 followRepository에서@Query("delete ~~");void deleteByUserId(@Param("userId"))이 메소드를 한 번 실행시키는 걸로 축소한다면 단 한 번의 쿼리로 축소할 수 있습니다.이렇다면 웬만한 데이터에 접근할 때 직접 쿼리를 날리는게 좋지 않나요? 왜 엔티티상으로 데이터에 접근하는지 궁금합니다.그리고 만약에 특유의 이유가 있다고 하여도 (객체 지향의 이유 등등) 쿼리를 4번에서 1번으로 줄일 수 있는 것을 포기할 정도의 이유인지도 궁금합니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@NotNull과 nullable의 차이 및 EnumType 질문
둘 다 null을 허가하지 않는 다는 의미로 쓰이는 것 같은데어떤 차이가 있는 건가요 ? @EnumType 애노테이션을 제거하고 멤버를 추가해도 @EnumType.Ordinal 옵션을 적용 한 것처럼 Integer로 컬럼을 만들고 user = 0, admin=1 으로 잘 저장하던데 @EnumType은 어떤 역할을 하는 것인가요? EnumType.String이 필수로 써야할만큼 EnuType.Ordinal은 안좋은 옵션같은데 Default가 String이 아니라 Ordinal인 거는 따로 무슨 이유가 있는 건가요 ?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
인텔리제이 mysql 콘솔창 질문
11강에서 부터 진행하시는 것을 보면 인테릴제이에서 mysql 콘솔창을 사용하시는 것으로 보입니다. 구글링 해보니까 커뮤니티 에디션에서는 사용이 불가한 것 같아서 위의 사진과 같이 비슷한 plug-in 사용해서 현재 작업중인데 강사님처럼 sql문 실행했을 때 결과값을 볼 수가 없습니다 ㅠㅠㅠ 해결 할 수 있는 방법이 없을까요??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트의 성능적 이점이 있나요 ?
1차 캐시, 쓰기지연, 더티체킹(스냅샷), 지연로딩영속성 컨텍스트의 특징이 이정도인 거 같은데 더티체킹은 엔티티(객체)를 컬렉션에서 관리하듯이 도와줘서 수정측면에서 도움이 많이 되는 것 같긴 한데 1차캐시나 쓰기지연 로딩은 디비에 데이터 몇 번 덜 접근한다고 해서 큰 차이 없을 것 같은데 성능적인 측면에서 많이 도움 되나요?실무를 해본 적이 없어서 제가 잘 모르는 것일까요 ?
-
미해결실전! 스프링 데이터 JPA
MemberRepositoryImpl 네이밍 관련 질문
강의에서 사용자 정의 리포지토리 인터페이스로 만들고, 이걸 구현한 클래스 이름은 리포지토리+Impl 이여야 된다고 하셨는데(강의에서는 MemberRepositoryImpl), 처음에 모르고 MemberRepositoryCustomImpl 로 구현 클래스 이름을 정했는데 테스트 코드도 잘 돌아가고 Query도 동일하게 나왔습니다 ...MemberRepositoryImpl 가 아니면 오류나야 되는 게 아닌가요 ? MemberRepositoryCustomImpl 로 했는데도 잘 작동한 이유가 궁금합니다 ... 네이밍이 틀려도 상관 없는건가요 ..?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Maven을 많이 사용하나요 ?
DB 접근 2편이나 활용1편에서는 Gradle을 사용해서application.properties를 통해 h2를 설정하고 build.gradle을 통해서 라이브러리를 받아왔던 것 같은데 이번 강의에서는 xml파일들을 사용해서 상당히 어색한데요.최근에 Gradle을 많이 사용한다면 xml로 설정하는 방법을 따로 공부할 필요는 없을까요?
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
Authentication should not be null 오류 질문
안녕하세요. 백기선님. 좋은 강의 감사합니다. 강의를 따라가다 Authentication 오류 해결에 어려움을 겪고 있어 질문드립니다. test소스 authenticated()에서는 Authentication should not be null 에러가 발생하고 뷰단에서도 isAuthenticated() 체크되지 않습니다. 디버깅을 해보면 UsernamePasswordAuthenticationToken 생성 이후 Authentication 객체가 만들어진 것은 확인을 했는데, 어느 시점에서 객체를 못가져오고 null이 찍힙니다.스프링시큐리티에 대한 지식이 없어 그런지 난감합니다. 도움주시면 감사하겠습니다.Spring-Security6 사용중입니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
데이터 베이스가 자꾸 오류나요
해당 오류가 생기면서 데이터베이스 로그인이 되지 않습니다. 뭘 어떻게 해야하나요....
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
패키지 이동시 import 깨짐
강좌대로 패키지에 모두 이동시켯더니 기존 refactor로import경로가 바뀌었지만 모두 비활성화 상태가 되어서오류가 나버립니다. 무슨이유일까요?
-
해결됨실전! 스프링 데이터 JPA
username 카멜케이스 질문
[질문 내용]별건아니고 그냥 궁금해서 그런건데,username에선 카멜케이스를 적용하지 않으시고,teamName에선 카멜케이스를 적용하시는데 이게 관례상 username은 한단어로 취급하고 그런게 있는건가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@ManyToOne이 외래키를 생성해준다고 이해해도 괜찮을까요??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 김영한님 설명을 들어보면 @ManyToOne어노테이션이 다대일 관계에서 객체와 테이블을 매핑해준다고 하셧는데 , @ManyToOne이 사용되면 객체와 테이블을 매핑해줌과 동시에 테이블에서도 외래키를 생성해준다고 생각하면 맞을까요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
expected 옵션이 없어서 질문드립니다.
Junit5로 테스트를 생성해서 그런지Test애노테이션에 expected 라는 옵션이 없어서@Test() public void 상품주문_재고수량초과() throws Exception { //given Member member = createMember(); Item book = createBook(10000, 10, "시골 JPA"); int orderCount = 11; //when Assertions.assertThatThrownBy(() ->orderService.order(member.getId(), book.getId(), orderCount)) .isInstanceOf(NotEnoughStockException.class); }이렇게 만들어서 돌렸는데 테스트가 통과했다면 그냥 넘어가도 되는 것일까요? @Test() public void 상품주문_재고수량초과() throws Exception { //given Member member = createMember(); Item book = createBook(10000, 10, "시골 JPA"); int orderCount = 11; //when Assertions.assertThatThrownBy(() ->orderService.order(member.getId(), book.getId(), orderCount)) .isInstanceOf(NotEnoughStockException.class); fail("재고 수량 부족 예외가 발생해야 한다."); }이렇게 돌리면 재고 수량 부족 예외가 발생해야 한다.java.lang.AssertionError: 재고 수량 부족 예외가 발생해야 한다. 라는 예외가 발생했습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
getTotalPrice에서 사용하는 필드? 질문입니다
public int getTotalPrice() { return orderPrice * count; } public int getTotalPrice() { return getOrderPrice() * getCount(); } 주문 아이템의 가격을 반환해야할 때 당연히 위처럼 코드를 작성해야겠다고 생각했는데, 강의를 보니 아래처럼 하시더라구요결국 같은 값을 반환하는 것 같은데 어떤 차이가 있는지 알 수 있을까요 ?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
cannot resolve symbol 오류
cannot resolve symbol 라는 오류가 여러개 뜨는데 어떻하면 좋을까요ㅠㅠ한참 구글링 해도 못찾겠어요ㅠㅠ
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
블로그에 작성하기
안녕하세요. 친절하신 답변 감사히 확인했습니다^^다름이 아니라 혹시 블로그에 간단하게 선생님께서 하시는 수업 내용을 제가 따라하는 것을 캡쳐나 정리하여 올려도 괜찮을까요? :)
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
rollback(false) 동작방식 관련 질문
섹션 4. 회원 도메인 개발] 회원 기능 테스트 강의를 수강하는 중 질문이 있습니다. @ExtendWith(SpringExtension.class) @SpringBootTest @Transactional // for rollback class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Autowired EntityManager em; @Test @DisplayName("회원가입") @Rollback(false) public void signUp() throws Exception { // given Member member = new Member(); member.setName("kim"); // when Long saveId = memberService.join(member); // then Assertions.assertThat(member).isEqualTo(memberRepository.findOne(saveId)); }@Rollback(false) 어노테이션을 사용한 결과 강의와 동일하게 db의 member table에 name = "kim" 이 정상적으로 들어온 것을 확인하였습니다. 그런데 이후 @Rollback(false) 어노테이션을 주석 처리한 뒤 Test를 실행하면, 위에서 저장했던 name="kim" 의 row가 지워진 것을 확인할 수 있었습니다. 여기서 저의 궁금증은, 첫 번째의 결과로 인해 name = "kim" 인 row가 이미 생성이 되었으므로, 2번을 실행할 때 memberService.join 메서드에서 이미 기존의 name="kim"인 데이터가 있으므로 오류를 발생시켜야 한다고 생각했는데요, 결과는 정상적으로 테스트가 수행됩니다.위의 이유를 잘 모르겠습니다.감사합니다.
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
안녕하세요 호돌맨님!
title이 글자수 10이 넘지 않으려면Post클래스 title객체에다가 @Max(value=10,"10이 넘으면 안된다") 를 붙이면 해결되지 않을까요??만약 기존에 있던 글들이 글자수 10이 넘으면 오류가 날테니? 그에따른 try catch문으로 substring적용해서 글자 수 줄여주고요!
-
해결됨실전! 스프링 데이터 JPA
스프링 데이터 jpa 페이징 (countQuery) 질문입니다
안녕하세요. 강의 영상보고 data jpa 를 사용해 프로젝트 진행중에 있습니다.다름이 아니라 카운트 쿼리에countQuery = "SELECT count(a) from Article a inner join fetch a.content where a.category =:categoryId and (a.title like %:keyword% or a.content.content like %:keyword%) join fetch 하면 에러가 발생하였고, 해다 에러 발생 이유는 구글링 후에 확인할 수 있었습니다.이유: 그런데 여기서 문제는 fetch join은 객체 그래프를 조회하는 기능이기 때문에 연관된 부모가 꼭 있어야 합니다. 그런데 수를 뽑는 count(u)로 조회 결과가 변경되어버렸기 때문에, 오류가 발생한 것이지요.그런데 하나 의문점이 생깁니다.해당 쿼리 내용을 보면, join 한 엔티티의 요소를 where절에서 찾고 있습니다.( a.content.content like %:keyword%)그런데 제가 알고 있는 개념으로는, 기본 Lazy loading 을 사용하게 되면, 연관되어 있는 엔티티를 프록시로 가져오는 것으로 알고 있습니다.그렇게 되면 저 where절의 부분에서 content가 프록시로 들어갔기 때문에, 올바르게 동작하면 안된다고 생각합니다.fetch를 사용하지 않아도, inner join으로만 쿼리가 날라가도, 쿼리 자체는 전부 실행되는 것인가요?그런데 가만히 생각해보면 그런 방식이라면, 지연로딩을 사용하는 방식이 사용자가 필요로 하지 않는 정보까지 join 하는 데이터베이스의 부하를 줄이기 위해 이렇게 하는 것으로 알고 있는데, fetch를 사용하지 않아도 데이터베이스에는 완전한 쿼리가 날라간다면, 이걸 굳이 스프링이 proxy로 끼워줄 필요가 있나? 하는 생각도 듭니다. 따라서 요약해보면,카운트 쿼리에서 조건에 따라 count 가 달라지므로, join을 할 때 fetch 를 넣지 않아도, 올바르게 작동하는 것이 맞는지맞다면 fetch를 사용하지 않아도 실제 데이터베이스에는 join 연산이 항상 일어나는 것이고, 대신 엔티티에 반환 해 줄 때, 프록시로 들어가는 것이고fetch 를 사용하게 되면 나왔던 모든 결과가 엔티티로 들어가 는 것이 맞는지 입니다.jpa 책이랑 웹 전부 뒤져봤는데 이 부분이 약간 모호해서 질문드립니다!