묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
단건조회시 fetch를 이용했을때 쿼리개수와 성능이 궁금합니다.
long startTime = System.currentTimeMillis(); BoardResponse.Detail response = boardService.findBoard(board.getId()); long endTime = System.currentTimeMillis(); // then System.out.println(endTime - startTime);해당 코드에서 findBoard Service는 게시글의 힌트, 태그, 정답, 공감을 가져와 DTO의 변환을 거쳐 하나의 게시글을 단건조회하는 서비스입니다.다만 여러 케이스로 테스트했는데단순히 findById로 로직을 테스트를 하게되면 해당 findBoard는 60~90ms의 실행속도와 쿼리가 지연로딩으로 인해 5개가 나가지만JPQL을 통해 DTO를 직접 접근하는 식으로 바꿨을땐, 쿼리를 1개로 나가지만 실행속도가 250~290ms가 나오게 되는데 단건조회의 경우 fetchJoin이나 join+DTO 방식을 쓰는것보다 지연로딩이 있더라도 일반적인 findById를 사용하는것이 좋은지 여쭤봅니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 객체 생성시 생성자 방식 VS Builder() 패턴 방식
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]두 객체 생성 방식의 차이를 간단하게 비교해서 알아본 결과 Builder 패턴을 이용하면 가독성이 좋아져서 Builder 패턴을 이용해 객체를 생성하는 것이 좋다VSBuilder 패턴은 코드가 복잡해지고 생성자 보다 성능이 떨어지므로 생성자 방식으로 개겣를 생성하는 것이 좋다.위와 같은 결론을 얻었습니다.이렇게만 보면 코드를 작성하는 사람의 차이인거 같은데실제 현업에서는 어떤 방식을 주로 사용하거나 선호하나요 ??
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
public interface UserRepository extends JpaRepository<User,Long> 코드 질문이요
안녕하세요 질문 드릴게 있습니다JpaRepository<User,Long>이 부분에서요 제네릭에 엔티티객체인 User를 넣는건 알겠는데요 Long을 넣는 이유가 혹시 id가 기준이라서 Long을 넣는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 db연결
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]오랜만에 들어갔더니 db연결이안돼요 ㅠ 이거때문에 application 실행도 안 되네요.ㅠㅠ 원래 잘만 되다가 오늘 어노테이션이랑 다 막혀있길래 gradle 을 refresh 했는데 그 이후 다른 빨간줄은 해결됐는데 db연결이 안됩니다
-
미해결실전! Querydsl
동적 쿼리 메서드 조합시 null 처리
@Test public void dynamicQueryWhereParam() { String usernameParam = null; Integer ageParam = 10; List<Member> result = queryFactory .selectFrom(member) // .where(usernameEq(usernameParam), ageEq(ageParam)) .where(allEq(usernameParam, ageParam)) .fetch(); assertThat(result.size()).isEqualTo(1); } private BooleanExpression usernameEq(String usernameParam) { if (usernameParam == null) { return Expressions.TRUE; } return member.username.eq(usernameParam); } private BooleanExpression ageEq(Integer ageParam) { if (ageParam == null) { return Expressions.TRUE; } return member.age.eq(ageParam); } private BooleanExpression allEq(String usernameParam, Integer ageParam) { return usernameEq(usernameParam).and(ageEq(ageParam)); }select m.* from member m where true and m.age = 10;위와 같이 Expressions.TRUE를 반환하게 만들면 쿼리에 true가 포함돼서 실무에서 사용하기에는 좀 그럴까요?
-
미해결실전! 스프링 데이터 JPA
Spring Data JPA delete 관련 질문
제가 따로 구현하지 않고Spring Data JPA JpaRepository 에서 상속받은deleteById 를 사용하면먼저 select query 가 1번 나간 다음에 찾아온 Entity로 delete 메서드를 호출하는 것 같더라구요그래서 총 select, delete 쿼리가 각각 1번 총 2번 나가는 것 같은데 PK로 delete 를 하고 싶을 때,@Query로 작성하여 delete 문을 1번 나가게 하는 것과,위의 방법대로 select, delete 각각 1번 나가는 방법 중에 어떤 방법을 사용하는 것이 좋은가요 ?
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
인터셉터 활용?
안녕하세요 호돌맨님!JWT 관련 강의에서 ArgumentResolver를 활용해 토큰 검증을 하고 사용자 정보를 추출해 반환하셨는데, 만약 프로젝트를 진행할 때 로그인을 해야 모든 URL에 접근할 수 있다고 한다면 아래 코드처럼 인터셉터에서 토큰 검증을 하고 ArgumentResolver에선 별다른 검증 없이 subject만 추출해서 반환해도 문제가 없을까요? 혹시 제가 접근 자체를 잘못하고 있다면 알려주시면 감사하겠습니다@Slf4j @RequiredArgsConstructor public class LoginCheckInterceptor implements HandlerInterceptor { private final JwtService jwtService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String requestURI = request.getRequestURI(); log.info("인증 체크 인터셉터 실행 {}", requestURI); String accessToken = request.getHeader("Authorization"); jwtService.validateAccessToken(accessToken); try { jwtService.getSubject(accessToken); } catch (JwtException e) { throw new Unauthorized(); } return true; } } @RequiredArgsConstructor public class JwtArgumentResolver implements HandlerMethodArgumentResolver { private final JwtService jwtService; @Override public boolean supportsParameter(MethodParameter parameter) { boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class); boolean hasLoginType = LoginUser.class.isAssignableFrom(parameter.getParameterType()); return hasLoginAnnotation && hasLoginType; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { String accessToken = webRequest.getHeader("Authorization"); Long userId = jwtService.getSubject(accessToken); log.info("userId = {}", userId); return new LoginUser(userId); } }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원가입 눌러도 반응이 없어요. 도와주세요 ㅠ
연동을 다해놨는데, 스프링 실행할때 에러가 나네요.. 이유를 못찾겠습니다.구글 드라이브에 올릴게요강의는 회원등록 4분46초 부분 하고 있었습니다. https://drive.google.com/file/d/1Xes5ztWKL5s4NDre1bSuGeL2t-tbnJIO/view?usp=sharing
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대다 관계 까지 수업듣고 질문 드립니다. (fk를 pk설정)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]예시로 드신 Member_Product 테이블의 관계는 주문 테이블이라고 이해가 되는데 이럴경우에는 fk 2개를 pk설정을 하면 중복된 값이 못들어와서 당연히 기본키를 하나 만들어 주는걸로 배웠는데 만약에 주문이 아니고 수강테이블처럼 중복된 값을 막아야 하는 경우에도 테이블 내에 pk를 하나더 만들어 주는게 맞을까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
실무에서는 그럼 spring.jpa.open-in-view: false 로 설정하는 경우가 많은가요 ?
실무에서spring.jpa.open-in-view: false로 설정하는 경우가 많은가요 ? 또한 사이드 프로젝트 정도로 규모가 작을 경우그냥 기본 설정대로 true로 사용해도 되나요 ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Transactional
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]트랜잭셔널 어노테이션을 레포지토리나 컨트롤러가 아니라 서비스에 붙이는 이유가 있나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
배치처리를 하려면 어떻게 해야하나요?
스프링이 제공하는 기능이 아니라 제가 직접해줘야하는건가요? 영속성 컨텍스트가 일정이상 차면 비워주는 작업을 어떻게 할 수 있을까요?코드가 나와있긴하지만 그 코드는 너무 로우 레벨아닌가요?? SPRING DATA JPA사용하면서 em을 직접적으로 사용하진 않잖아요..자동으로 해주는건가요...?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
프록시 벗기기가 언제 필요하나요?
어떤 상황에서 하이버네이트가 제공하는 프록시벗기기가 필요한가요?(프록시 객체에서 원본객체를 가져오는 메서드가 필요한 상황)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 코드 작성할때 주문수량 8에서 10
주문기능테스트 8분 59초 보면8개로 했다가 10개로 바꾸면 에러 나는데 h2 db에 해당 데이터를 확인할 수 가 없어서요해당 테스트 한 데이터 값 남게하려면 어떤 어노테이션을 사용했는데 그게 뭘까요 ?그리고 제가 알기론 테스트는 한번실행하고 나서 다시 초기화 시켜주는 걸로 알고 있는데 어떻게 8개 했다가 10으로 바꿨다고 에러가 나는 건가요 ? 강의를 아무래도 병행하다 보니 드문드문 띄게 되네요 이런게 강의자료에도 잘 설명이 되면 더 좋을텐데 스프링 문법이 안써있어서 너무 아쉬워요 책을 사야 할까요 ?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
osiv관련 질문
osiv가 뷰에서도 지연로딩이 가능하게 하려고 도입한거잖아요 (뷰에서 필요한값들을 지연로딩으로 가져오려고)근데 지연로딩을 하면 결국 필요없는 쿼리가 추가로 나가게될텐데..애초에 필요한 데이터만 jpql사용해서 뽑아서 주면 문제가 해결되는거아닌가요? 왜osiv를 사용하는거죠?? 뷰와 리파지토리가 너무 연관되어서 그런가요..? 그게 그렇게 큰 단점인가요..?뭔가 osiv의 장점이 엄청많아보이는데 제가 다른 분들 프로젝트를 봤을때는 osiv를 거의 적용안했던것같거든요... 왜 잘 안쓰이는걸까요...
-
미해결실전! 스프링 데이터 JPA
페이지를 유지하면서 엔티티를 DTO로 변환관련하여 질문
스프링 데이터 JPA 페이징과 정렬 강의 부분에서페이지를 유지하면서 엔티티를 DTO로 변환하기Page<Member> page = memberRepository.findByAge(10, pageRequest); Page<MemberDto> dtoPage = page.map(m -> new MemberDto());페이지를 유지하면서 엔티티를 DTO로 변환하는 예제가 있습니다.만약에 아래와 같이 Page<Member> page = memberRepository.findByAge(10, pageRequest); List<Member> dtoPage = faqListPage.stream().map(MemberDto::new) .toList();List<> 로 반환하여 페이징 처리를 하였는데 페이지를 유지한 첫번째 방식 차이점이 있을까요??실무에서는 어떤 방식을 사용하나요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
[13강] application.yml 파일 설정에서 문제가 있습니다.
강사님이 설명 해 주시는 대로 정말 다 따라했는데 안돼요.. 사용자 정보가 db에 등록이 안되어서 뭐가 문제인지 살펴봤는데아래 driver-class-name 경로가 인식이 안됩니다..강사님은 ctrl 누르고 클릭하면 파일 경로로 이동이 되시던데 전 안되네요.. 나름대로 구글링 해서 해결책을 찾아봐서 몇 개 시도해 봤습니다. mysql connector 파일 따로 다운받아서 java 11 버전 lib 파일에 옮기고외부 라이브러리 추가 해 줬습니다. build.gradle 파일에 의존성 코드도 추가해줬습니다. 그런데 해결이 안되네요...뭘 잘못했나 싶어서 파일 새로 다운받고 강의도 처음부터 다시 들으면서 따라했는데 소용없고 mysql도 원래 깔려있었어서 지우고 다시 깔았습니다.서버 run 하면 오류 안 뜨고 잘 돌아가고 웹 사이트도 접속이 잘 되는데 db 저장만 안 됩니다.. 런 로그입니다..오후 6:26:28: Executing ':LibraryAppApplication.main()'...> Task :compileJava UP-TO-DATE> Task :processResources UP-TO-DATE> Task :classes UP-TO-DATE> Task :LibraryAppApplication.main(). ____ _/\\ / ___'_ __ (_)_ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v2.7.6)2023-05-30 18:26:34.455 INFO 268 --- [ main] c.g.libraryapp.LibraryAppApplication : Starting LibraryAppApplication using Java 11.0.17 on DESKTOP-A2F7K18 with PID 268 (C:\Users\djxka\Desktop\library-app\build\classes\java\main started by djxka in C:\Users\djxka\Desktop\library-app)2023-05-30 18:26:34.460 INFO 268 --- [ main] c.g.libraryapp.LibraryAppApplication : No active profile set, falling back to 1 default profile: "default"2023-05-30 18:26:35.842 INFO 268 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.2023-05-30 18:26:35.884 INFO 268 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 18 ms. Found 0 JPA repository interfaces.2023-05-30 18:26:37.789 INFO 268 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)2023-05-30 18:26:37.808 INFO 268 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]2023-05-30 18:26:37.809 INFO 268 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.69]2023-05-30 18:26:38.079 INFO 268 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext2023-05-30 18:26:38.080 INFO 268 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3479 ms2023-05-30 18:26:38.455 INFO 268 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...2023-05-30 18:26:39.011 INFO 268 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.2023-05-30 18:26:39.095 INFO 268 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]2023-05-30 18:26:39.259 INFO 268 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.6.14.Final2023-05-30 18:26:39.640 INFO 268 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}2023-05-30 18:26:39.960 INFO 268 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect2023-05-30 18:26:40.429 INFO 268 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]2023-05-30 18:26:40.451 INFO 268 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'2023-05-30 18:26:40.540 WARN 268 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning2023-05-30 18:26:41.279 INFO 268 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''2023-05-30 18:26:41.300 INFO 268 --- [ main] c.g.libraryapp.LibraryAppApplication : Started LibraryAppApplication in 8.059 seconds (JVM running for 9.476)2023-05-30 18:26:49.558 INFO 268 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'2023-05-30 18:26:49.559 INFO 268 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'2023-05-30 18:26:49.561 INFO 268 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms 도와주세요ㅠㅜㅠㅜ
-
해결됨Practical Testing: 실용적인 테스트 가이드
마이바티스와 테스트 코드
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요.안녕하세요 강사님 강의 너무 잘 듣고있습니다. 회사에서 Mybatis로 개발 중인데 테스트 코드 작성에 어려움이 있어 질문 드립니다. JPA의 경우 CRUD가 기본적으로 구현되어 있지만, Mybatis의 경우 xml(또는 인터페이스)에 정의된 메서드를 사용하기 때문에 테스트 코드 작성이 어렵더군요.. 만약 Money 테이블이 있고, 해당 Repository에 Select 코드가 없는 경우 어떻게 검증을 해야 좋을까요? 테스트를 위해 xml이나 인터페이스에 새로운 코드를 작성하는 것은 좋은 방법이 아닌 것 같고, Jdbc Template를 이용해봤는데 이 경우에는 데이터가 롤백되지 않는 등의 문제가 있었습니다.( 아마 잘못 사용해서 그런 것 같기도 합니다..) Repository 부분을 Mock으로 Stub하여 테스트를 진행하는 것도 생각해 보았습니다. 이 경우에는 Repository 쿼리를 수정할 때마다 Service에 정의된 Stub도 그에 맞게 계속 수정해야 하는 문제가 있어서 이 방법도 적합하지 않다고 생각이 들었습니다..(이 케이스도 A,B 각각 모듈 단위의 테스트는 성공하나 결합하여 테스트할 때 실패하는 경우라고 볼 수 있을까요?) 회사가 테스트 코드를 작성하는 문화는 아니어서 물어볼 사람이 없어 질문 남깁니다.. 좋은 강의 감사하합니다. 앞으로도 좋은 강의 기대하겠습니다!!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
jpa 영속성 컨텍스트 질문입니다.
em.persist(member1); em.persist(order1); em.persist(order2); em.flush(); em.clear(); <-- order1 내용 변경 --> em.persist(order1); tx.commit()flush와 clear까지 하면 db에 반영은 되어있고 order1의 내용을 조금 바꾼뒤 persist하면 1차 캐시에 올라가있을텐데, commit을 하면 실제 db에 아무것도 뜨지 않습니다.em.clear 주석 하고, 내용 변경 후 em.persist의 유무와 상관없이 db에 잘 반영이 됩니다.clear와 persist 사이의 무슨 관계가 있는 것 같은데, db에 아무것도 뜨지 않는 이유가 뭔가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 연관관계 편의 메서드 하는 이유
안녕하세요, 양방향 연관관계 편의 메서드를 하는 이유는 순수한 객체 상태에서 봤을 때 양쪽에 값이 있어야 하기 때문인걸로 이해를 했습니다.order와 member가 다대일인 관계라 했을 때,보통 멤버를 db에서 find해서 쓸텐데, 이러면 member에서의 orderList를 가지고 오려면 연관관계 편의 메서드 와는 상관없이 db에서 join을 해서 가지고 오더라구요,,보통 프로젝트나 현업에서 순수한 객체 상태에서 쓸 일이 있나요?아니면 연관관계 편의 메서드를 썼을 때 다른 이점이 있나요?