묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
EntityManager 싱글톤
https://www.inflearn.com/questions/158967 먼저 다른 여기 부분에서 질문이 있습니다. "스프링 프레임워크는 여기에 실제 EntityManager를 주입하는 것이 아니라, 사실은 실제 EntityManager를 연결해주는 가짜 EntityManager를 주입해둡니다." 말씀을 하셨는데 풀어서 제가 이해한내용은 가짜로 주입을 하고 실제 비즈니스 로직을 탈때 예시를 들면 사용자A가 사용을 하고 EntityManager 가 실행 될때 실제로 EntityManager를 호출하고 로직이 끝나면 가짜 EntityManager를 주입하고 사용자B가 호출을 하면 가짜 EntityManager가 실제 EntityManager를 호출하여 실행이 되서 싱글톤이긴 하나.. 분기(?) 처리해서 EntityManager를 사용하고 있다라고 이해를 하고 있는데 맞을까요.. 아니라고 하면 풀어서 설명이 가능할까요? 초보적인 질문을 드려서 죄송합니다..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
validateDuplicateMember 부분 질문입니다
안녕하세요. 요즘 강사님 덕분에 재밌게 공부하고 있습니다 ^^ 강의 듣다가 궁금한 부분이 생겨서 질문 남기게 되었습니다. 강의 5: 10초 부분에서 findMembers.size() > 0 으로 바꾸는게 좀 더 최적화 될 수 있다고 말씀하셨는데 isEmpty()의 시간복잡도가 O(1)이고 size()는 O(n)으로 알고 있습니다. 그래서 isEmpty()를 주로 썼었는데 단순히 조건에서의 효율만 말씀하신 것이 아니라는 생각이 드네요. 혹시 실제 실무에서는 저런 경우 어떤식으로 최적화 하는지 대략적으로라도 알 수 있을까요?
-
해결됨스프링 시큐리티
RequestCache 가 있는 상태에서 뒤로가기 문제
안녕하세요, 강의 너무너무 재밌게 듣고 있는 수강자입니다 :) 오늘 인증 성공 핸들러 강의 듣다가 몇가지 테스트를 해봤는데, 정말 난감한 상황을 마주쳤습니다. 어떤 사용자가 아래처럼 행동한다고 가정하겠습니다. 1. 메인페이지( = "/" ) -> 마이페이지 메뉴 클릭 2. 로그인 화면 뜸 (이때 세션에 RequestCache 가 생성) 3. 뒤로가기 4. 화면 상단의 로그인 버튼 클릭 5. 로그인 화면 뜸 (여전히 세션이 2번의 RequestCache 를 간직함) 6. 로그인을 성공 7. 마이페이지로 이동 이럴 때는 어떻게 해야할지 정말 난감하네요. 그냥 로그인 버튼을 클릭해서 로그인에 성공했으니, 로그인 성공 디폴트 경로인 "/" 로 보내고 싶습니다. 어떻게 하는게 좋을까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 주인
안녕하세요 강의를 듣고 있습니다... 기본편에도 보긴봤지만.. 뭔가 한마디로 표현해서 개념을 잡는게 중요한거 같아서요... 제가 공부하고 아는선에서만 나열해봅니다.. 1. 연관 관계 주인만 등록,수정,삭제 할수 있고 주인이 아닌곳은 읽기만 가능하다 여기서 주인이 아닌곳은 mappedBy 한곳이다. 2. 강의중에 자동차를 비유하시는 강의가 있으신데. 자동차와 자동차바퀴가 있을때 1:n 생각을 해보면 자동차는 변경될 필요가 없고 바퀴를 변경해야되는 경우가 있으니 연관 관계 주인이다. 라고 이해를 하면 될까요? N 값이 주인이다 라고 이해를 하고 있습니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
위임하는 클래스 구현 이유
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 상품 서비스는 상품 리포지토리에 단순히 위임만 하는 클래스라고 하셨는데 굳이 구현하는 이유가 있는지 궁금합니다. 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Junit5 의 Assertions.fail 에 대해 질문이 있습니다.
@Testpublic void 상품주문_재고수량초과() throws Exception { //Given Member member = createMember(); Item item = createBook("시골 JPA", 10000, 10); //이름, 가격, 재고 int orderCount = 11; //재고보다 많은 수량 //When assertThrows(NotEnoughStockException.class, () -> { orderService.order(member.getId(), item.getId(), orderCount);}); //Then fail("재고 수량 부족 예외가 발생해야 한다.");} 안녕하십니까. 김영한님의 강의를 열심히 수강중인 학생입니다. Junit5에 대해 질문이 있어 글을 올립니다. 제가 Junit5를 배워보려고 강의 진행중 Junit4 대신 Junit5 를 써보았습니다. 그런데 Assertions.fail 때문에 위 코드가 자꾸 실패가 뜨더라고요. 제가 생각한 로직은 김영한님 강의에서 처럼 Assertions.assertThrows 안의 로직에서 예외를 던지면 fail까지 내려오지 않고 그대로 테스트가 성공으로 종료되며, 만약 예외를 던지지 않으면 fail까지 내려와 테스트 실패가 나오는 것이었습니다. 어떻게 코드를 수정하면 될까요? ------------------------------------------------------------------------------------------------------------------ 설명이 부족한 것 같아 추가로 남깁니다. 위 코드는 재고보다 많은 수량이 입력됐을때 예외를 제대로 내뱉는지 확인하기 위한 테스트입니다. 만약 예외를 제대로 뱉었다면 김영한님 강의에서처럼 fail() 까지 안넘어가고 assertThrows 에서 테스트가 종료되고 성공으로 반환되어야 했습니다. 그런데 위 코드에서는 코드 진행이 fail까지 내려가고 그대로 실패가 뜨더라고요. Service, repository와 같은 기타 다른 연관 코드들은 김영한님 코드와 동일하게 작성하였으며, fail을 주석처리하고 위 테스트를 돌렸을 경우 성공처리가 됩니다. 상기 목적을 달성하려면 위 코드를 어떻게 수정하면 될까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
38:45 에서 em.close()를 해도 Lazy 예외가 발생하지 않습니다.
em.detach() 나 em.clear()를 해줄시, 프록시 객체가 영속성 컨텍스트에서 지워져서 이후, 프록시 객체의 메서드를 호출했을때 Lazy 예외가 발생합니다. 하지만 수업에서 하는 것처럼 em.close()를 해도 예외가 발생하지 않고, 실제 객체가 영속성 컨텍스트에 올라와 동작합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Casecade
Casecade 옵션은 부모에 걸지 부모가 아닌곳에 걸지 상황에따라 다른건가요 ?
-
미해결스프링 시큐리티
디버깅 방법
안녕하세요. 잘 듣고 있습니다. 현재 제가 사용하는 인텔리J에서는 WebSecurityConfigureAdapter.java 디버깅이 안되는데.. (찾아보니 외부 Jar 파일을 디버깅하려면 remote 디버깅을 해야한다는데 이방법으로 하신건가요? ) 인텔리J에서 어떤식으로 설정을 해야 강사님이 하는 것과 같이 디버깅이 되는건가요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
페이징 시도 시 Out of Memory의 원인
안녕하세요, 김영한 강사님.페치 조인 시 페이징을 시도하면 메모리에서 프로세싱이 이루어지기 때문에 Out of Memory가 일어날 수 있다고 말씀주셨는데요. 이 이유가 정렬 시 추가적인 메모리 공간을 사용하기 때문인가요? 대량의 데이터를 페이징 없이 쿼리하면 메모리를 거치지 않고 결과값을 내려주나요? 페이징 없이 쿼리를 하더라도 메모리를 통한다면 수 많은 데이터를 쿼리하더라도 Out of Memory가 일어날수 있는게 아닌가 싶어서요. 혹시 제가 디비 쿼리 원리를 잘못 이해하고 있는걸까요. 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Bean 등록시 EntityManager 오류 질문드립니다.
안녕하세요. 핵심원리를 듣고 이번 강의를 들으면서 배운 것을 적용하려고 시도해보았습니다. Service interface와 Repository interface를 생성하여, componentscan을 사용하여 빈을 등록하려고 했습니다. 기존 service와 repository를 Impl로 바꾸어 @Component 어노테이션을 붙여 의존관계를 자동 주입하려고 했습니다. ``` @Component@Transactionalpublic class MemberServiceImpl implements MemberService { private final MemberRepository memberRepository; @Autowired public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } ``` @Componentpublic class MemoryMemberMemberRepository implements MemberRepository { @PersistenceContext private final EntityManager em; @Autowired public MemoryMemberMemberRepository(EntityManager em) { this.em = em; }@Configuration @ComponentScan( excludeFilters = @ComponentScan.Filter(classes=Configuration.class))public class AppConfig {} @Testpublic void 회원가입() throws Exception{ //given AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); 해당 코드를 테스트를 시도하였지만 No qualifying bean of type 'javax.persistence.EntityManager' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 이라는 오류가 발생하였습니다. 개념이 많이 부족하여 질문을 제대로 했는지도 정확하지않고, 해당 오류가 왜 나는지 잘 모르겠습니다 ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원서비스 테스트 트랜잭션과 entitymanager
강의를 듣고 질문들을 보면서 저나름 정리한 내용인데 확실히 맞는지가 궁금합니다. ! 1. Test에서 데이터변경이 일어나기에 @Transactional 에너테이션으로 트랜잭션시작을 지정한 상황에서 MemberService의 join메서드가 실행되면 join메서드도 @Transactional 에너테이션이 있어도, 동일한 트랜잭션으로 인식한다. (트랜잭션 내부의 트랜잭션이여도 동일한 트랜잭션) 2. 그렇다면 MemberServiceTest 트랜잭션과 MemberService의 트랜잭션이 동일한 트랜잭션이기에 스프링은 동일한 EntitiyManager를 제공하므로, 동일한 영속성 컨텍스트에 접근하기때문에, 엔티티 동일성을 보장한다. (요부분은 궁금한 내용입니다!) 3. spring boot를이용하면 @PersistenceContext로 EntitiyManagerFactory로부터 EntitiyManager를 받아오는것을 지원하는데, spring data jpa를 이용하면 스프링 컨테이너에서 스프링 빈 DI하는것과 같이 생성자주입(여타 다른 주입도 상관없음,, 필드주입,, setter주입)을 통해서 EntitiyManager를 받아올수있다고 하셨는데, 그럼 EntitiyManager가 스프링빈과같이 스프링 컨테이너에 존재한다는 의미인가요??? 항상 잘듣고있습니다. 읽어주셔서 감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
getReference의 id값 조회시
저랑 비슷한 고민을 하시는분의 질문들을 봤는데 "내부적으로 값을 가지고 있기에 쿼리가 안나간다" 라는 답변을글 보았습니다 ! 1.여기서 내부적이라는게 그냥 순수 자바객체를 뜻 하시는걸까 요?(영속 컨텍스트는 clear로 깨끗해졌지만 자바 객체는 아직 남아있으니) 2. name값도 내부적으로 남아있다고 생각이 드는데 제가 좀 놓친부분이 있을까요?? ㅠㅠ 3. 이미 em.getReference에 파라미터로 id값을 넣었기 때문에 이미 알고있다고 jpa가 인식해서 쿼리를 안내보내는건가요 ??
-
해결됨스프링 시큐리티
`익명 사용자` 개념에 대한 질문
`익명 사용자` 라는 것이 그냥 보기에는 접속이 가능한 것처럼 보였지만, 강의와 여러 QnA 를 다시 보다알게된 결론으로 정리를 해보았습니다. Spring Security 에서의 `익명사용자` 개념 정리 인증이 되기 전이나, 이후 의 사용자 모두유효한 인증토큰을 갖고있지 못하면 `익명 사용자`이다 `익명 사용자`는 로그인이 가능한 경로를 통해 인증허가를 을 받게 될 경우, 일반 사용자로 등극하여, 로그인 접속 및 향후 접속유지가 가능하게된다. 인증을 받지 못한 사용자는 `익명 사용자`로 분류되어, `익명 사용자` 인증 토큰이(인증 객체) 익명 사용자 관리 명목으로 생성되지만, 로그인과 관련된 접근 권한은 없다(세션 생성이 되지않음) -> `redirect /login page` `익명 사용자` 전용으로 발급된 인증토큰을 통해, 향후 `익명 사용자` 접근 여부를 관리 할 수 있다 틀린 부분이 있다면 조언을 구합니다. 감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
복잡하고 join이 많은 쿼리에 대해 질문이 있습니다.
안녕하세요 영한님 강의도 듣고, 책도 잘읽고 있습니다. 요즘엔 책을 주로 읽고 있네요 ㅎㅎ 다름이 아니라 제가 질문이 있습니다. 제가 jpa를 사용하는 개인 프로젝트를 진행중이고, 영한님 책을 보면서 많은 도움을 받고있습니다. 그런데 책에는 주로 join이 많아야 한번정도 있는 예제들이 많은데, 제가 사용하는 쿼리는 join을 4번씩이나 하고, 그렇게 해서 나온 결과 행들중 랜덤으로 하나의 row를 추출해야하는 형태라 order by random() limit 1 이런식의 조건을 주려했습니다. 다소 조인이 많이들어간 쿼리인데 spring data jpa 의 @query를 사용하려다보니 쿼리가 너무 길어서 뭔가 하드코딩하는 느낌도 들고, @query에서는 rand를 지원하지 않더군요... 이런경우에는 주로 querydsl을 사용하나요? 다른 질문을 보니 creteria 는 사용하지 않는게 좋다는 의견이있으셔서 질문드립니다. 아니면 단순히 jparepository를 구현한 repository 인터페이스를 이용해서도 해결이 가능할까요?ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Service와 Entity 비즈니스 로직에 관해
안녕하세요. DDD Start라는 책을 함께 읽으며 영한님의 강좌를 다시 한번 보고 있습니다. 그러던 도중 과연 어디까지 비즈니스 로직으로 보아야할까에 대한 의문점이 생겼습니다. 책에서는 도메인(엔티티) 쪽에 비즈니스 로직을 두고 서비스 레이어는 각 도메인의 함수를 호출하는 형태로 구현하여 서비스를 최대한 얇게 만들어야한다고 하더라구요. 그런데 이번 강의 2분 49초쯤을 보면 중복 회원을 검증하는 코드가 서비스 레이어에 위치해있습니다. 회원가입이라는 기능에서 중복 회원 검증이라는 규칙은 서비스에 있어 핵심 비즈니스 로직이라고 생각하는데요. 이 부분을 엔티티쪽에 두어 검증하지않고 서비스 레이어에 두셔서 혼란이 오더라구요. 질문을 요약하자면, 1. 중복 회원 검증 코드는 비즈니스 로직이라고 봐야할까요? 2. 맞다면 비즈니스 로직은 엔티티에 들어가야 하지 않나요? 3. 요구사항에는 중복 검증뿐만 아니라 수많은 검증 로직들이 존재할텐데, 이를 서비스에 작성해야할지 엔티티에 작성해야할지 어떠한 기준으로 판단해야할까요? 4. 도메인(엔티티)에서는 레포지토리를 호출하면 안된다고 알고 있습니다. 현업에서는 이를 명확하게 지키면서 코드를 작성하나요? 5. 만약 4번이 맞다면, 중복 회원 검증의 경우 실제 데이터베이스에 조회하는 쿼리를 날려야합니다. 이렇게 데이터베이스에 접근해야하는 로직의 경우 엔티티에 작성하면 안되는걸까요? (모든 질문은 DDD를 기반으로 질문드립니다!) 많은 예제들을 살펴보아도 서비스레이어에 작성할지 엔티티쪽에 작성할지 기준을 잡기가 정말 힘드네요.. 이 부분에 대해서 영한님의 의견을 듣고 싶습니다. 감사합니다 :)
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
윈도우에서 gradle로 빌드하시려는 분께 공유드립니다.
윈도우 환경에서 gradle로 빌드 하시려는 분들을 위해 공유 드립니다. 1. build.gradle dependencies { ... classpath "com.github.node-gradle:gradle-node-plugin:3.1.0" } classpath에 node-gradle 을 추가해 주시고 def preinstalledNodeDistributionDirectory = file("${projectDir}/src/main/resources/static/node") 이거 하나 선언해 주시고 apply plugin: "com.github.node-gradle.node" 위 플러그인 적용해주시면 node { version = '11.15.0' // 제가 사용중인 노드 버전을 적었습니다. download = true nodeModulesDir = file("${projectDir}/src/main/resources/static") } task copyFrontLib(type: Copy) { from "${projectDir}/src/main/resources/static" into "${projectDir}/build/resources/main/static/." } copyFrontLib.dependsOn npmInstall compileJava.dependsOn copyFrontLib 해당 코드를 추가하여 사용하시면 build시에 프런트 라이브러리들을 빌드에 추가하실 수 있습니다. 2. css 깨짐 현상 본 강의와 같이 부트스트랩을 사용하셔서 동일한 css를 적용시키려면 그냥 install bootstrap으로는 안되는것같습니다. 버전이 달라서 css 속성명이 달라졌나봐요... 그래서 만약에 build에 정상적으로 라이브러리 추가 되시는데 뷰가 어디가 좀 깨져서 나오시거나 css가 적용이 잘 안되시면 "dependencies": { "bootstrap": "^4.4.1", "jquery": "^3.4.1" } 선생님이 강의에서 사용하신 버전으로 명시적으로 바꾸어주셔야 합니다. 저렇게 적용하면 정상적으로 뷰가 나와요... 많이 해맸네요ㅜㅜ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
cancelOrder에서 order.cancel에 의해 발생할 수 있는 IllegalStateException에 대한 처리는 필요없나요??
이미 상품이 발송되었을 때 IllegalStateException이 발생하게 되어있는데, 이에 대한 처리는 없는 것 같아서 질문드립니다.그리고 만약에 이것에 대해 처리해주는게 맞다면 처리는 어떻게 해야할까요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Delivery에 있는 Address 관련하여 질문드립니다.
안녕하세요 선생님 강의 잘 듣고 있습니다. Delivery에 Address가 있는데 이 값은 Delivery에 있는 Order를 참조하고 그 안에 있는 Member를 참조하면 가져올 수 있지 않나요 ? 참조가 너무 많이 일어나기 때문에 Address를 Delivery에 선언하는건가요 ??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@BatchSize 와 컬렉션 페치조인 관련해서 질문이 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. . 안녕하세요. 김영한 강사님. 김영한님 강의를 열심히 수강하는 학생입니다. . 다름이 아니라 제가 "페치조인 2 - 한계" 챕터의 13분 부터 19분까지 진행되는 강의 내용중 이해가 안되는 부분이 있어서 이렇게 질문을 하려합니다. . 분명 강의 내용에서는 컬렉션을 페치조인 한 후 페이징 API를 사용할 수 없다고 하였습니다. . 그리고 이를 극복하기 위하여 @BatchSize를 이용하는 방법이 소개되는데, 이 방법이 어떤 면에서 해결에 도움이 되는지 모르겠습니다. . 컬렉션을 페치조인 한 후 페이징 API를 사용할 수 없는 이유는 1대다 조인으로 뻥튀기된 데이터들을 페이징API로 DB에서 잘라올 경우 JPA가 잘려진 데이터만 받기 때문에 이를 기반으로 잘못된 정보를 내보낼 수 있기 때문이었습니다. . 그리고 @BatchSize는 LazyLoading 된 데이터들을 사용할때마다 가져오지 않고 한꺼번에 가져오는 역할을 담당하여 Lazyloading의 성능을 개선하는 역할을 하고 있습니다. . 이것만 놓고 보면 @BatchSize가 컬렉션 페치조인의 페이징과 어느 면에서 관련있는지 모르겠습니다. 한꺼번에 가져오는 기능은 데이터가 잘려들어오는 것과 관련이 없어 보이거든요. 혹시 제가 잘못알고 있는걸까요? 답변 부탁드립니다.