inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

중첩 내부 클래스 문제풀이2 - 코드 리뷰 좀 해주세요.

해결됨

김영한의 실전 자바 - 중급 1편

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 중첩 내부 클래스 문제풀이2 풀긴 했는데 좀 부분들이 좀 달려서 이것도 괜찮은가? 싶은 게 있습니다. 이 코드를 보고 좀 고쳐야 할게 있을까요? 참조는 inner클래스 car클래스를 참조했습니다. addBook() 메서드에서 new book(내용) 이게 더 낳은것 같으니 이거 빼고요. 추가1. 문제풀이1 문제4 AnonymousMain을 인텔리제이 자동완성으로 풀게 되었는데 이것은 괜찮은지 묻고싶습니다. 답변 부탁드립니다.

  • java
  • 객체지향
생각하는자 댓글 1 좋아요 0 조회수 168

db순서가 이상해요

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] db순서가 영어 알파벳 순서대로 바뀌네요 왜 그러는건지 이해가 안됩니다,

  • java
  • jpa
형종 댓글 1 좋아요 0 조회수 213

동영상 버그

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

동영상 재생이 제대로 보이지 않고 버그 현상이 반복 됩니다 한번쯤은 점검이 있어야 될 것 같네요

  • python
  • java
  • c
  • 정보처리기사
hoogok 댓글 1 좋아요 0 조회수 107

trylock(1500)질문입니다

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

안녕하세요 강의 잘보고 있습니다. 강의 내용중 tryLock메서드 실습 부분에 서 tryLock에 인자로 500 밀리초를 넘겨 0.5초동안 락을 획득하지못하면 포기하는 것을 실습했습니다. 추가로 1500밀리초를 넘겨서 돌려봤는데 이때도 락을 얻지 못했습니다. 출금시간은 1초라서 락해제까지 완료가 된상태인데 왜 다음스레드가 락을 얻지 못할까여,, ㅠㅠ 19:00:56.252 [ Thread-1] 거래 시작: BankAccountV5 19:00:56.252 [ Thread-0] 거래 시작: BankAccountV5 19:00:56.254 [ Thread-1] [검증 시작] 출금액: 800, 잔액: 1000 19:00:56.254 [ Thread-1] [검증 완료] 출금액: 800, 잔액: 1000 19:00:56.752 [ main] t1 state: TIMED_WAITING 19:00:56.752 [ main] t2 state: TIMED_WAITING 19:00:57.258 [ Thread-1] [출금 완료] 출금액: 800, 잔액: 200 19:00:57.258 [ Thread-1] Thread-1 락 해제 19:00:57.258 [ Thread-1] 거래 종료 19:00:57.758 [ Thread-0] [진입 실패] 이미 처리중인 작업이 있습니다 if (!lock.tryLock(1500, TimeUnit.MILLISECONDS)) { log("[진입 실패] 이미 처리중인 작업이 있습니다") return false } lock.lock() //그냐 트라이랑 세트라 보삼 try { log("[검증 시작] 출금액: $amount, 잔액: $balance") if (amount > balance) { log("[검증 실패] 출금액: $amount, 잔액: $balance") return false } log("[검증 완료] 출금액: $amount, 잔액: $balance") Thread.sleep(1000) balance -= amount log("[출금 완료] 출금액: $amount, 잔액: $balance") } finally { log("${Thread.currentThread().name} 락 해제") lock.unlock() //언락 반드시 해야함 } 코드가 코틀린인점 죄송합니다.. 자바랑 같은라이브러리를 사용해서 혹시나해서 여쭤봅니다

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
준호 댓글 1 좋아요 0 조회수 263

section04 포트폴리오 리뷰

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

지금 section04 포트폴리오 리뷰까지 왔는데 지금은 작성자, 비밀번호 , 제목 , 내용을 입력하고 등록하기 버튼을 눌러도 등록안되고 에러뜨는게 정상인건가요? 저만 안되는건가 싶어서요

  • react
  • node.js
  • seo
  • graphql
  • next.js
댓글 2 좋아요 0 조회수 193

Next.js 사전 렌더링에 대해서 더 궁금한 부분이 있습니다.

해결됨

한 입 크기로 잘라먹는 Next.js

안녕하세요 Next.js 강의를 잘 보고 있습니다. Next.js 장단점 내용을 보고 궁금한 점이 생겨서 질문드립니다. 1. 8:59초에 서버에서 모든 컴포넌트를 사전 렌더링을 한다고 말씀하셨는데, 작성한 모든 컴포넌트의 HTML을 서버에 생성해놓는다는 의미인가요? 그렇다면 그 HTML을 받아서 브라우저가 파싱할 때, 서버로부터 받는 스크립트는 해당 컴포넌트의 관련된 로직의 js 파일을 받아오는건가요? 이 동작까지 Next.js에서 담당해주는건가요..? 사용자의 접속 요청이 들어왔을 때, FCP는 빠르겠지만 이 과정에서 서버에서 모든 컴포넌트의 사전 렌더링이 진행되고, 하이드레이션 과정까지 있습니다. 전처리 작업은 늘어난 것 같고, 사용자의 인터렉션이 불가한 지점까지 있는데 이 부분은 어떻게 핸들링하는지와 과연 FCP가 단축된게 장점이라고 할 수 있는지 궁금합니다. 해소가 안되는 부분들이 계속 생기는데, 영상을 계속 보다보면 뒤에서 다 설명을 해주시는 부분들일까요...?

  • react
  • typescript
  • next.js
mins 댓글 4 좋아요 0 조회수 594

gradlew clean build 시 예외가 발생합니다.

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

> Task :test FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///C:/Spring_kyh/%EC%8A%A4%ED%94%84%EB%A7%81%20%EB%B6%80%ED%8A%B8%EC%99%80%20JPA%20%ED%99%9C%E C%9A%A91/jpashop/build/reports/tests/test/index.html * Try: > Run with --scan to get full insights. BUILD FAILED in 4s 8 actionable tasks: 8 executed 다른 질문들 찾아보다가 https://www.inflearn.com/community/questions/1251256/gradlew-%EB%B9%8C%EB%93%9C%EA%B0%80-%EA%B3%84%EC%86%8D-%EC%8B%A4%ED%8C%A8%EB%A1%9C-%EB%9C%B9%EB%8B%88%EB%8B%A4?focusComment=336001 이 답변을 보고 gradle도 8.5로 바꿔봤는데 똑같은 오류가 발생해 질문드립니다. 환경변수도 제대로 설정했는데도 똑같은 증상이 발생합니다

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
맥스 댓글 2 좋아요 1 조회수 787

강의 콘솔처럼 rolled back 기록이 안 보이네요

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

@ExtendWith(SpringExtension.class) @SpringBootTest class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional public void testMember() throws Exception { //given Member member = new Member(); member.setUsername("memberA"); //when Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); //then Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); } 2024-08-27T08:46:11.488+09:00 INFO 20440 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2024-08-27T08:46:11.607+09:00 INFO 20440 --- [ Test worker] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:tcp://localhost/~/jpashop user=SA 2024-08-27T08:46:11.610+09:00 INFO 20440 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2024-08-27T08:46:12.826+09:00 INFO 20440 --- [ Test worker] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) 2024-08-27T08:46:12.846+09:00 DEBUG 20440 --- [ Test worker] org.hibernate.SQL : drop table if exists member cascade 2024-08-27T08:46:12.853+09:00 DEBUG 20440 --- [ Test worker] org.hibernate.SQL : drop sequence if exists member_seq 2024-08-27T08:46:12.860+09:00 DEBUG 20440 --- [ Test worker] org.hibernate.SQL : create sequence member_seq start with 1 increment by 50 2024-08-27T08:46:12.866+09:00 DEBUG 20440 --- [ Test worker] org.hibernate.SQL : create table member ( id bigint not null, username varchar(255), primary key (id) ) 2024-08-27T08:46:12.872+09:00 INFO 20440 --- [ Test worker] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2024-08-27T08:46:13.228+09:00 WARN 20440 --- [ Test worker] 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 warning 2024-08-27T08:46:13.272+09:00 INFO 20440 --- [ Test worker] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html] 2024-08-27T08:46:13.987+09:00 INFO 20440 --- [ Test worker] jpabook.jpashop.MemberRepositoryTest : Started MemberRepositoryTest in 6.47 seconds (process running for 8.794) WARNING: A Java agent has been loaded dynamically (C:\gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy-agent\1.14.19\154da3a65b4f4a909d3e5bdec55d1b2b4cbb6ce1\byte-buddy-agent-1.14.19.jar) WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information WARNING: Dynamic loading of agents will be disallowed by default in a future release 2024-08-27T08:46:14.774+09:00 DEBUG 20440 --- [ Test worker] org.hibernate.SQL : select next value for member_seq Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 2024-08-27T08:46:14.914+09:00 INFO 20440 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2024-08-27T08:46:14.918+09:00 INFO 20440 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2024-08-27T08:46:14.933+09:00 INFO 20440 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. > Task :test BUILD SUCCESSFUL in 26s 4 actionable tasks: 1 executed, 3 up-to-date 오전 8:46:15: Execution finished ':test --tests "jpabook.jpashop.MemberRepositoryTest.testMember"'. Transactional 애노테이션을 붙였는데 롤백얘기가 안보이네요... JUnit5로 해서 차이가 있는걸까요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
맥스 댓글 2 좋아요 0 조회수 319

예외 처리에 대한 질문

미해결

토비의 스프링 6 - 이해와 원리

리포지토리 계층에서 모든 데이터 액세스 기술에서 발생하는 예외는 DataAccessException으로 랩핑되어서 던져진다고 말씀하셨는데 받는 쪽인 서비스 계층에서는 DataAccessException의 서브클래스 타입의 예외를 받게 될거 같은데요. 서비스 계층에서 받게 되는 예외가 예를 들어 DuplicateKeyException이라서 처리를 하게 된다면 서비스 계층은 특정 리포지토리의 예외에 종속적이게 될거 같습니다. 그래서 컨트롤러 단으로 예외를 넘겨 ExceptionHandler로 처리해주는 것이 좋은 방법일까?에 대해서 질문 드리고 싶습니다. 근데 만약 서비스 계층에서 처리한다면, // @Service 안에 있는 있는 일부 코드 (회원가입 로직) public boolean saveCustJoinInfo(UserDto userDto) { String pwd1 = userDto.getPwd().split(",")[0]; String password = passwordEncoder.encode(pwd1); userDto.setPwd(password); try { userDao.insertUser(userDto); return true; } catch (DataAccessException e) { return false; } } 이렇게 처리해도 문제가 없는가에 대해 궁금합니다. 예외 처리에 대한 여러 블로그들을 읽어봤는데 다수의 사람들이 사용자 정의 예외클래스를 정의해서 던지도록 한 이유도 궁금합니다. 만약 이 방법이 좋지 않다면 어떤 계층에서 처리하면 특정 계층이 기술에 종속적이지 않게 예외를 처리할 수 있는지 조언해 주시면 감사하겠습니다. 토비님의 스프링 강의를 일주일 만에 완강했는데 너무 좋은 강의라 부트 강의도 구매하였습니다ㅎㅎ 아키텍처에 대한 강의도 고려하시고 있다고 하셨는데 기다리고 있겠습니다!!

  • java
  • spring
springYam 댓글 2 좋아요 0 조회수 220

getPublicUrl로 이미지 URL 받는 방법?

해결됨

[풀스택 완성] Supabase로 웹사이트 3개 클론하기 (Next.js 14)

getImageUrl을 얻는 방식을 강의 방식이 아닌 getPublicUrl을 사용해서 얻으려면 어떻게 해야 하나요?

  • firebase
  • next.js
  • tailwind-css
  • react-query
  • supabase
Jihwaan Chun 댓글 1 좋아요 0 조회수 339

SSR실습 질문

해결됨

한 입 크기로 잘라먹는 Next.js

파라미터를 받아서 특정 도서 상세페이지로 이동하는 [id].tsx에서 이전에 사용하던 export default async function fetchBooks(q?: string): Promise<BookData[]> { let url = `http://localhost:12345/book`; export default async function fetchBooks(q?: string): Promise<BookData[]> { let url = `http://localhost:12345/book`; if (q) { url += `/search?q=${q}`; } try { const response = await fetch(url); if (!response.ok) { throw new Error(); } return await response.json(); } catch (err) { console.error(err); return []; } } 이 코드에서 아래와 같은 방식도 가능할까요? export default async function fetchBooks(q?: any): Promise<BookData[]> { let url = `http://localhost:12345/book`; if (typeof q === "string") { url += `/search?q=${q}`; } else if (typeof q === "number") { url += `/${q}`; } try { const response = await fetch(url); if (!response.ok) { throw new Error(); } return await response.json(); } catch (err) { console.error(err); return []; } }

  • react
  • typescript
  • next.js
tkv00 댓글 1 좋아요 0 조회수 158

reactQuery와 supabase의 channel등

해결됨

[풀스택 완성] Supabase로 웹사이트 3개 클론하기 (Next.js 14)

reactQuery의 queryFn : ['users'] supabase의 channel의 const channel = supabase.channe l("online_users", { 부분 users와 online_users의 쓰임새를 모르겠습니다. queryFn : ['users', userId]를 하면 useEffect의 의존성 배열처럼 userId의 값에 따라 실행되는게 맞나요? 그럼 'users'는 뭔가요? 구조가 잘 와닿지 않습니다.ㅜㅜ const channel = supabase.channe l("online_users", { 도 " online_users"라는 이름값을 다른곳에서 사용할 때 쓰임새가 있는건가요?

  • firebase
  • next.js
  • tailwind-css
  • react-query
  • supabase
정지죤 댓글 1 좋아요 0 조회수 207

On-Demand-ISR 방식을 index 페이지에 적용하는 방법

해결됨

한 입 크기로 잘라먹는 Next.js

안녕하세요 선생님! 해당 수업에서 On-Demand-ISR을 적용하기 위해 page/api/revalidate.ts 파일에 재 생성을 요청하는 handler 함수를 정의를 했습니다. // 강의에서 작성한 handler 코드 export default async function handler( req: NextApiRequest, res: NextApiResponse ) { try { // 인덱스 페이지를 요청받을 때 revalidate 되도록 하기 await res.revalidate("/"); // 재 생성이 잘 완료되었다는 걸 리턴함 return res.json({ revalidate: true }); } catch (err) { // 재생성 실패 했을 떄 실행할 코드 res.status(500).send("실패"); console.error(err); } } 현재 강의에서는 직접 localhost:3000/api/revalidate 를 입력해 수동으로 페이지를 재 생성했는데, 만약 인덱스 페이지 접속할 때마다 자동으로 페이지를 재 생성하고 싶으면 useEffect 훅을 사용하면 될까요? 아래는 제가 작성한 코드입니다! useEffect(() => { fetch("/api/revalidate") .then((res) => res.json()) .then((data) => { if (data.revalidate) { console.log("페이지가 성공적으로 재생 성되었습니다."); } }); }, []);

  • react
  • typescript
  • next.js
yeongi0111 댓글 2 좋아요 0 조회수 371

JPA강의에서 Build and run using 을 Gradle로 사용하는 이유 알 수 있을까요?

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

다른 강의에선 작동 속도때문에 전부 인텔리제이로 바꿔서 진행했었는데 강의 교안을 보면 스프링부트 3.2 이상부터는 gradle로 하라고 나와있어 궁금하여 질문드립니다.

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
맥스 댓글 1 좋아요 0 조회수 152

localhost:8080 Whitelabel Error Page 뜹니다...

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요, 해당 static 폴더에 index.html파일에 코드를 입력한후 서버 실행결과 whilelabel 에러가 뜹니다. 해결에 도움을 주시면 감사하겠습니다.. 콘솔 내용 :: Spring Boot :: (v3.3.3) 2024-08-26T17:27:55.146+09:00 INFO 4895 --- [ main] h.hello_spring.HelloSpringApplication : Starting HelloSpringApplication using Java 17.0.12 with PID 4895 (/Users/kipyo/Documents/스프링/hello-spring/out/production/classes started by kipyo in /Users/kipyo/Documents/스프링/hello-spring) 2024-08-26T17:27:55.148+09:00 INFO 4895 --- [ main] h.hello_spring.HelloSpringApplication : No active profile set, falling back to 1 default profile: "default" 2024-08-26T17:27:55.573+09:00 INFO 4895 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) 2024-08-26T17:27:55.580+09:00 INFO 4895 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2024-08-26T17:27:55.580+09:00 INFO 4895 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.28] 2024-08-26T17:27:55.606+09:00 INFO 4895 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2024-08-26T17:27:55.607+09:00 INFO 4895 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 433 ms 2024-08-26T17:27:55.743+09:00 WARN 4895 --- [ main] ion$DefaultTemplateResolverConfiguration : Cannot find template location: classpath:/templates/ (please add some templates, check your Thymeleaf configuration, or set spring.thymeleaf.check-template-location=false) 2024-08-26T17:27:55.768+09:00 INFO 4895 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/' 2024-08-26T17:27:55.772+09:00 INFO 4895 --- [ main] h.hello_spring.HelloSpringApplication : Started HelloSpringApplication in 0.793 seconds (process running for 0.952)

  • java
  • spring
  • mvc
  • spring-boot
도도한 황새 댓글 2 좋아요 0 조회수 630

강의 4분 28초에 대해 질문 있습니다.

해결됨

실전! 스프링 데이터 JPA

"성능 최적화를 할텐대 어쨋든 이 데이터를 두 개를 가지고 있어야 돼요" 라는 부분이 있는데요 여기서 하나는 실제 엔티티 객체고 나머지 하나는 스냅샷으로 저장한 초기 상태의 엔티티 객체를 말하는건가요?

  • java
  • spring
  • spring-boot
  • jpa
감바스 댓글 1 좋아요 0 조회수 126

단순 조인과 페치 조인에 대해 질문 있습니다.

미해결

실전! 스프링 데이터 JPA

첫번째 JPQL Query("select m from Member m join m.team ") List<Member> findInnerJoin(); @Test public void test() { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); Member member1 = new Member(10, "member1", teamA); Member member2 = new Member(10, "member2", teamB); memberRepository.save(member1); memberRepository.save(member2); em.flush(); em.clear(); List<Member> members = memberRepository.findInnerJoin(); for (Member member : members) { System.out.println("member = " + member); System.out.println("member.getTeam().getClass() = " + member.getTeam().getClass()); System.out.println("member.getTeam().getName() = " + member.getTeam().getName()); } } 실행결과 Hibernate: select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 join team t1_0 on t1_0.team_id=m1_0.team_id member = Member(id=1, username=member1, age=10) member.getTeam().getClass() = class study.data_jpa.entity.Team$HibernateProxy$w0d2fXxq Hibernate: select t1_0.team_id, t1_0.name from team t1_0 where t1_0.team_id=? member.getTeam().getName() = teamA member = Member(id=2, username=member2, age=10) member.getTeam().getClass() = class study.data_jpa.entity.Team$HibernateProxy$w0d2fXxq Hibernate: select t1_0.team_id, t1_0.name from team t1_0 where t1_0.team_id=? member.getTeam().getName() = teamB 첫번째 JPQL에서는 전형적인 N + 1 문제가 발생함을 알 수 있습니다. 그래서 첫번째 JPQL에서의 select문에 t만 추가를 해봤습니다. 두번째 JPQL @Query("select m, t from Member m join m.team t") List<Member> findInnerJoin(); 실행결과 Hibernate: select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username, t1_0.team_id, t1_0.name from member m1_0 join team t1_0 on t1_0.team_id=m1_0.team_id member = Member(id=1, username=member1, age=10) member.getTeam().getClass() = class study.data_jpa.entity.Team member.getTeam().getName() = teamA member = Member(id=2, username=member2, age=10) member.getTeam().getClass() = class study.data_jpa.entity.Team member.getTeam().getName() = teamB 위 실행 결과를 보고 페치 조인과 무슨 차이가 있을까 해서 페치 조인을 테스트 해봤습니다. 세번째 JPQL @Query("select m from Member m join fetch m.team t") List<Member> findMemberFetchJoinTeam(); @Test public void ManyToOneFetchJoin() { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); Member member1 = new Member(10, "member1", teamA); Member member2 = new Member(10, "member2", teamB); memberRepository.save(member1); memberRepository.save(member2); em.flush(); em.clear(); List<Member> members = memberRepository.findMemberFetchJoinTeam(); for (Member member : members) { System.out.println("member = " + member); System.out.println("member.getTeam().getClass() = " + member.getTeam().getClass()); System.out.println("member.getTeam().getName() = " + member.getTeam().getName()); } } 실행결과 Hibernate: select m1_0.member_id, m1_0.age, t1_0.team_id, t1_0.name, m1_0.username from member m1_0 join team t1_0 on t1_0.team_id=m1_0.team_id member = Member(id=1, username=member1, age=10) member.getTeam().getClass() = class study.data_jpa.entity.Team member.getTeam().getName() = teamA member = Member(id=2, username=member2, age=10) member.getTeam().getClass() = class study.data_jpa.entity.Team member.getTeam().getName() = teamB 두번째 JPQL과 세번째 JPQL의 차이를 보면 두번째 JPQL의 select문에서 m1 _0.tea m_id 도 조회하고 세번째 JPQL의 select문에서는 m1 _0.tea m_id 을 조회하지 않습니다. 두번째 JPQL과 세번째 JPQL이 정확히 어떤 차이가 있어 select문에서 조회하는 컬럼이 달라지는지 궁금합니다.

  • java
  • spring
  • spring-boot
  • jpa
감바스 댓글 2 좋아요 0 조회수 151

비공정 모드가 공정 모드가 빠른 이유

해결됨

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 비공정 모드가 공정 모드가 빠른 이유가 뭔지 자세히 궁금합니다. 비공정 모드에서도 어느 정도 대기큐가 있다고 하셨는데 그 걸 제외하고 공정 모드에서는 대기큐를 사용하면 어떤 스레드가 다음 락을 가져야할 지 알기 때문에 좀 더 빠르지 않나? 라는 생각이 들어서요.. 그리고 비공정 모드에서는 반대로 대기큐를 사용하지 않았기 때문에 공정 모드보다 락 얻기 위한 경합이 일어나서 좀 더 느릴 수 있는거 아닌가..? 싶어서 여쭤봅니다.. 시스템 상황에서 어떻게 비공정 모드가 공정 모드보다 빠른지 이해가 가지 않네요..ㅠㅠ

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
워니 댓글 1 좋아요 0 조회수 297

도메인 모델 아키텍처 패턴 추가 리팩토링

미해결

토비의 스프링 6 - 이해와 원리

추가적인 리팩토링 해보기 PaymentService 에서 exRate 계산을 Payment 가 직접 하도록 할 수 있음 exRateProvider 를 Payment 안으로 넣어주면됨 시간계산은 Clock 을 Payment 안으로 넣어줘도 됨 추가 리팩토링을 진행하면 Payment 의 prepare 메서드의 내부 로직은 한 줄이면 끝남 강의 중 말씀 해주신 위의 설명을 토대로 PaymentService, Payment 클래스를 리팩토링하고 PaymentTest 클래스를 수정 해 보았습니다. PaymentService의 prepare 메서드 @Component public class PaymentService { private final ExRateProvider exRateProvider; private final Clock clock; public PaymentService(ExRateProvider exRateProvider, Clock clock) { this.exRateProvider = exRateProvider; this.clock = clock; } public Payment prepare(Long orderId, String currency, BigDecimal foreginCurrencyAmount) throws IOException { return Payment.createPrepared(orderId, currency, foreginCurrencyAmount, this.exRateProvider, this.clock); } } Payment의 createdPrepared 메서드 public static Payment createPrepared(Long orderId, String currency, BigDecimal foreginCurrencyAmount, ExRateProvider exRateProvider, Clock clock) throws IOException { BigDecimal exRate = exRateProvider.getExRate(currency); BigDecimal convertedAmount = foreginCurrencyAmount.multiply(exRate); LocalDateTime validUntil = LocalDateTime.now(clock).plusMinutes(30); return new Payment(orderId, currency, foreginCurrencyAmount, exRate, convertedAmount, validUntil); } PaymentTest class PaymentTest { @Test void createPrepared() throws IOException { Clock clock = Clock.fixed(Instant.now(), ZoneId.systemDefault()); ExRateProviderStub exRateProvider = new ExRateProviderStub(valueOf(1_000)); Payment payment = Payment.createPrepared( 1L, "USD", BigDecimal.TEN, exRateProvider, clock ); Assertions.assertThat(payment.getConvertedAmount()).isEqualByComparingTo(valueOf(10_000)); Assertions.assertThat(payment.getValidUntil()).isEqualTo(LocalDateTime.now(clock).plusMinutes(30)); } @Test void isValid() throws IOException { Clock clock = Clock.fixed(Instant.now(), ZoneId.systemDefault()); ExRateProviderStub exRateProvider = new ExRateProviderStub(valueOf(1_000)); Payment payment = Payment.createPrepared( 1L, "USD", BigDecimal.TEN, exRateProvider, clock ); Assertions.assertThat(payment.isValid(clock)).isTrue(); Assertions.assertThat( payment.isValid(Clock.offset(clock, Duration.of(30, ChronoUnit.MINUTES)))).isFalse(); } } 질문 제가 진행한 리팩토링이 올바르게 행하였는지 궁금합니다. Test를 진행할 때 exRateProvider 를 사용하기 위해서 기존에 작성하였던 ExRateProviderStub 오브젝트를 생성하여 테스트를 진행해 주는 것이 맞는지 궁금합니다. 처음에 ExRateProviderStub exRateProvider = null; 을 사용해 봤더니 java.lang.NullPointerException: Cannot invoke "tobyspring.hellospring.payment.ExRateProvider.getExRate(String)" because "exRateProvider" is null 이와 같은 에러가 발생하였습니다. 제가 ExRateProvider 객체가 null로 설정해서 발생한 에러인걸 이해 하고, ExRateProvider 를 구현한 객체가 필요하기 때문에 ExRateProviderStub 오브젝트를 생성하여 exRate 를 넣어 주었습니다. 3. ExRateProviderStub 오브젝트를 생성하여 exRate (적용환율)을 넣고 생성하는 이유는 실제 api가 아닌 일부 기능을 테스트하기 위해서 저희가 직접 적용환율을 적용해보고 외화금액과 곱해서 계산된게 맞는지 테스트하는 목적이다. 라고 제가 이해하였는데 올바르게 이해한 것인지 궁금합니다. PS. 제가 아직 배운 내용을 완전히 소화하지 못한 부분이 있을 수 있어, 질문에 대한 설명이 부족할 수 있습니다. 혹시 잘못된 부분이나 추가적인 조언이 있다면 피드백 부탁드립니다. 감사합니다.

  • java
  • spring
햄토리 댓글 2 좋아요 3 조회수 1252

Nextjs14 에서의 react query사용의 필요성

해결됨

[풀스택 완성] Supabase로 웹사이트 3개 클론하기 (Next.js 14)

리액트 쿼리를 사용하면 결국 client side fetching이 됩니다. nextjs13부터 server side fetching이 가능해지고 suspense를 활용한 data streaming은 데이터펫칭에서 새로운 패러다임을 제시했다고 생각합니다. 굳이 리액트 쿼리를 사용할 이유가 있을까요?

  • next.js
  • react-query
  • supabase
5MIN VET 댓글 1 좋아요 3 조회수 691

인기 태그

인프런 TOP Writers

주간 인기글