묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Transactional 과 Lazy Loading
안녕하세요 강의 잘 듣고 있습니다. 다름이 아니라 프로젝트를 업그레이드 하는 과정에서 오류가 생겨 질문 드립니다. package ShopProject.myShopProject.Domain; import ShopProject.myShopProject.Domain.Item.Item; import ShopProject.myShopProject.Domain.Order.Order; import jakarta.persistence.*; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.Getter; import lombok.Setter; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member",cascade = CascadeType.REMOVE) private List<Order> orders = new ArrayList<>(); private String loginId; private String password; @OneToMany(mappedBy = "member") private List<LikedItem> likedItems = new ArrayList<>(); } package ShopProject.myShopProject.Domain; import ShopProject.myShopProject.Domain.Item.Item; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter public class LikedItem { @Id @GeneratedValue @Column(name = "likedItem_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") private Item item; } 보시는 것처럼 멤버와 좋아요 상품은 Lazy 관계에 있습니다. OneToMany는 기본이 Lazy이므로 명시하지 않았습니다.따라서 좋아요 상품은 직접 조회될 때만 DB에서 조회되고, 다른 경우는 프록시 형태로 존재합니다. //아이템 상세 정보 @GetMapping("item") public String itemDetail(@RequestParam("itemId") Long itemId, @SessionAttribute(name = "loginMember") Member loginMember, Model model) { log.info("item 호출"); Item item = itemService.findOne(itemId); log.info(loginMember.getLoginId() + " " + loginMember.getName()); // 좋아요 여부 추가 model.addAttribute("isLiked", memberService.isliked(loginMember, item)); //이 부분입니다!! model.addAttribute("item", item); model.addAttribute("member", loginMember); if (item.getCategory().equals("Book")) { return "items/item/book"; } if (item.getCategory().equals("Album")) { return "items/item/album"; } if (item.getCategory().equals("Movie")) { return "items/item/movie"; } return "items/item"; } 위 컨트롤러를 호출하면, isliked라는 매소드를 실행하게 됩니다. 좋아요 여부를 확인하는 메소드입니다. //좋아요 아이템이 아니면 false 반환 @Transactional public Boolean isliked(Member member, Item item) { log.info("좋아요 확인 메서드 실행"); // log.info("멤버 정보" + member.getName() + " " + member.getLoginId()); for (LikedItem likeditem: member.getLikedItems()) { //여기에서 lazyinitializationError 발생 if (likeditem.getItem().getName().equals(item.getName())) { log.info("좋아요인 경우"); return true; } } log.info("좋아요 아닌 경우"); return false; } 그런데 여기에서 맴버의 좋아요 목록을 불러오면 lazyinitialization 에러가 발생합니다... 정말 많이 원인도 구글링해보았는데, 영속성 컨텍스트가 종료 된 후 접근할 때 발생하는 것을 알았습니다.영속성 컨텍스트의 생명주기는 트렌잭션과 거의 동일하다고 알고 있습니다. 만약 위 메소드에 트렌젝션 어노테이션이 없다면 member.getLikedItems() 의 결과를 초기화해주지 않으면 오류가 발생할 것입니다. 따라서 트렌젝션 어노테이션을 넣으므로서, member.getLikedItems()를 가져오고, 직접 DB에서 불러오는 과정을 한 트랜젝션 안에서 수행하도록 했습니다. 그런데 이 메서드에서 계속 LazyinitializatoinError가 발생합니다. 이 부분의 원인을 전혀 못 찾겠습니다.. 해결책으로는 DTO를 사용하거나, fetch Join을 사용해서 멤버와 같이 조인하여 한번에 가져옴으로 해결할 수있을 거라 생각합니다. 하지만 해결책은 알았지만, 위 코드의 무슨 오류가 있는지 정말 궁금합니다. 따라서 이 코드의 오류를 알고 싶습니다. 또한 저의 이해에 오류가 있다면 그 부분도 알려주시면 감사하겠습니다.
-
미해결스프링 핵심 원리 - 기본편
자동주입 @Configuration
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]수동 주입을 사용하면 @Configuration을 설정 정보 클래스에 붙여줘야 싱글톤으로 유지된다고 배웠습니다. 자동 주입에서는 내부적으로 알아서 CGLIB 기술을 활용하여 싱글톤을 보장하는건가요?? 제가 생각하기에는 자동주입을 사용하는 경우에도 @Configuration 어노테이션이 예를 들어서 @ComponentScan이나 @Component 등 안에 들어가야 있을거 같은데 확인해보니까 없어서 약간 의아합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
이런 문제가 발생합니다
애초에 없는 파일이라 뜨는데 뭐가 잘못된건가요??
-
미해결쉽게 시작하는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
폐쇄망(offline)환경 쿠버네티스 구축 문의
안녕하세요,강의를 열심히 수강하고 있는 수강생입니다.폐쇄망(Offline) PC 에서 동일한 환경을 구축하고자 하였으나,vagrant에서 부터 막혔습니다.인터넷이 되는 PC에서 수동으로 옮겨 문제가 없을거라 생각했는데, 하나하나 문제가 발생하고 있습니다.오프라인으로 환경을 구성하려면 수동으로 vagrant file에 있는 패키지들을 다운받아서 옮겨야 하나요?오프라인 환경으로 구축하는 수강생도 많을거라 생각하여, 이에 질문드립니다!추가로, vagrant file을 이해하고 넘어가는게 좋겠죠?!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
localhost:8080/path 빈화면 출력 에러에 관하여
프로젝트 생성 후 서버를 띄우는 것까지는 정상적으로 작동하였고 서블릿 코트를 작성해서 설정한 urlPatterns에 입력한 값으로 검색을 하니 Whitelabel Error Page만 계속 뜨는데 어떤 부분에서 문제인지 잘 모르겠습니다.
-
해결됨Flutter로 SNS 앱 만들기
riverpod으로 상태관리하기
안녕하세요 선생님, 강의 흥미롭게 잘 듣고 있습니다.저는 Provider에 대한 지식이 없어 제가 알고있던 riverpod을 사용하여 프로젝트를 진행하고 있었습니다.그런데 이 강의의 update함수를 override하여 인증상태를 관리하는 부분에서 막혔습니다.riverpod의 StateNotifer에는 해당 기능이 없더라구요..(FirebaseAuth.instance.userChanges()에 따라서 state를 변경시키는 부분.)혹시 만약 riverpod을 사용한다면 어떤 방향으로 코딩을해야할까요? 답변주시면 감사하겠습니다!
-
해결됨홍정모의 따라하며 배우는 C++
캐스팅에 대해 질문이 있습니다.
18:30 즈음부터 명시적 형변환에 대한 설명이 나옵니다. 내용은 아래와 같습니다.// C 스타일 캐스팅 (int)4.0; // CPP 스타일 캐스팅 int(4.0);그런데 따로 알아보니 강의 내용과 좀 맞지 않는 부분이 있는 것 같았습니다. 아래 링크를 간략하게 설명하면,https://en.cppreference.com/w/cpp/language/explicit_cast(int)4.0 과 같은 C-style cast를 컴파일러가 만나게 되면 아래 순서에서 맨 처음으로 해당 캐스팅의 조건을 만족하는 것이 선택되어 수행된다고 합니다. (컴파일 될 수 없더라도!)const_caststatic_caststatic_cast 다음 const_castreinterpret_castreinterpret_cast 다음 const_cast즉, C-style cast를 사용하면 위 캐스팅 종류 중 어떤 것이 사용되었는지 명확히 알 수 없다는 것을 의미합니다.여기에 추가적으로, 클래스 간 상속관계에서 private와 protected가 public으로 간주될 수도 있는 등의 예외도 존재하기 때문에 최근에는 C-style cast가 권장되지 않는 것으로 보입니다. 19:10에는 C-style cast와 나머지 캐스팅 방식 간에 기능성 차이가 없다고 나오는데, 차이가 충분히 있는 것 같습니다. 아래 Stackoverflow 글에도 관련 내용이 있습니다.https://stackoverflow.com/questions/27359961/c-difference-between-reinterpret-cast-and-c-style-cast 그리고 위에 있던 cppreference 링크의 functional-style cast 부분을 살펴보면, CPP 스타일 캐스팅이라고 소개된 int(4.0)는 사실상 C-style인 것을 알 수 있습니다.If there is exactly one expression in parentheses, this cast expression is exactly equivalent to the corresponding C-style cast expression.그래서 const_cast, static_cast, reinterpret_cast가 CPP 스타일 캐스팅이라고 소개되는 것이 옳지 않나 생각합니다.
-
미해결스프링 핵심 원리 - 기본편
자바빈 vs 스프링빈
자바빈 과 스프링빈은 용어에서 빈이라고 되어 있어서 헷갈리는데요, 그냥 다른 것이라고 생각하는데 더 나을까요?
-
미해결PZM기반 실무중심 백엔드 부트캠프(프리트레이닝)
117번 동영상이 안올라온거 같아요
그런거 같아요
-
해결됨After Effects CC 2020 모션 그래픽의 입문 Part.1
sound & Export 강의 후반부에 랜더링을 하고 소리만 들리고 영상이 안나옵니다.
sound & Export 강의 후반부에 랜더링을 하고 소리만 들리고 영상이 안나옵니다.영상에서 video OutPut을 체크해줘야 나온다고 했는데 체크까지 해줬는데 왜 안 나오는것인지 모르겠습니다..
-
미해결깃헙 블로그(Github blog)로 차별화 된 나만의 홈페이지 만들기!
bundle exec jekyll serve 재실행시 오류가 발생합니다.
안녕하세요.bundle exec jekyll serve 명령어를 입력해서 로컬서버를 띄우려고 하면 다음과 같은 에러가 발생합니다.[!] There was an error while loading minimal-mistakes-jekyll.gemspec: No such file or directory @ rb_sysopen - package.json. Bundler cannot continue. # from C:/Repository/GitHubBlog/weinhooney.github.io/_site/minimal-mistakes-jekyll.gemspec:3 # ------------------------------------------- # spec.add_development_dependency "rake", ">= 12.3.3" > end # require "json" # -------------------------------------------의미대로 minimal-mistakes-jekyll.gemspec 파일을 loading하다가 package.json 파일이 없어서 발생한 오류인데요._site 폴더 안에 package.json 파일을 복사해서 붙여넣으면 해결이 되긴 합니다.하지만 bundle exec jekyll serve 명령으로 로컬서버가 가동된 이후 복사해서 붙여넣었던 package.json 파일이 삭제되면서 다시 로컬서버를 가동할 때 같은 에러가 발생합니다. 매번 번거롭게 package.json 파일을 _site 폴더 안에 넣지 않고 로컬서버를 재가동하는 방법이 있을까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
함수에 대해 질문있습니다.
자바스크립트 함수가 조금 어려운데 함수는 그냥 관련된 코드들을 작성할 때 사용하나요? 예를 들어 input으로 어떠한걸 한다면 input 함수를 만들어서 이 함수안에는 input과 관련된 코드들을 작성한다고 보면되는건가요?
-
미해결입문자를 위한 LangChain 기초
typer 호환 문제
마지막 RAG 강의에서, 첫번째 명령문을 실행시키면, !pip install -q langchain langchain-openai tiktoken chromadbtyper 호환과 관련된 에러가 발생합니다. =====================ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. spacy 3.7.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible. weasel 0.3.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible.=====================ChatGPT를 통하여 여러 해결방안을 제시받아 시도해 보았는데 해결이 되지 않습니다. 손쉬운 해결 방법이 있을지요?
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)
jinja2templates
수업대로 127.0.0.1:8000/items/{id} 를 넣었는데starlette.routing.NoMatchFound: No route exists for name "static" and params "path".internal Server Error 가 나옵니다 ㅠBASE_DIR, directory 모두 수업대로 다 입력했습니다. 구글링을 해도 방법을 찾질 못해서요.
-
미해결실전! 스프링 데이터 JPA
단건 조회 시 Optional
<순수 JPA 기반 리포지토리 만들기>에서 단건 조회 시 Optional로 반환하는데, repository layer에서 orElseThrow를 던지는 방법은 별로인가요?
-
해결됨김영한의 실전 자바 - 중급 1편
Time클래스 Period의 값을 LocalDate에 넣기
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 궁금중이 생겨서 질문을 남깁니다.Period클래스를 이용해서 지정 범위 의 시간을 구한 것을,다시 LocaDate로 값을 바꾸고 싶을때,아래의 코드처럼 코딩을 하였는데요,LocalDate startDate = LocalDate.of(2024, 1, 1);LocalDate endDate = LocalDate.of(2024, 11, 21);Period period = period.between(startDate, endDate);LocalDate localDate = LocalDate.of(period.getYears(),period.getMonths(),period.getDays());이런 코드 스타일이라고 할까요? 이렇게 코드 짜는게 맞나요?(TestBetween클래스 코드를 좀 수정 한 것입니다.)답변 부탁 드립니다.(추가) - 코드 변경 + 내용 수정글을 다시 보니 글이 너무 이상하네요. 좀 죄송합니다.저가 너무 서포터즈님 들의 도움만 바라는 것인가? 라는 생각도 좀 드는데.. 이것도 지적해주시면 감사하겠습니다.
-
미해결Vue3 완벽 마스터: 기초부터 실전까지 - "기본편"
강의 동영상 재생 오류
강의가 재생이 안됩니다.다른 강의는 재생이 되네요.이상하네요. 다른 기기로(테블릿)는 또 재생이 되고폰으로는 안되는데더 이상한건 폰으로 할때도 이 강좌 말고 다른 강좌는 이상이 없으니 브라우저 문제도 아니고...
-
미해결Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex
vuex 실행시 새로고침해야지만 리스트에 나타나는 현상
안녕하세요!강의 듣으며 코드 작성중에 있는데vuex로 코드를 작성하게 되면서 props데이터를 삭제하고 store.js로 mutation로 app.js에 있는 methodsf를 옮기게 되면서 새로고침해야지만 리스트가 추가/삭제되는 현상이 나타나고 있습니다. 다시 삭제했다가 작업해도 마찬가지네요.. 코드양이 너무 방대해서 올리기는 어려울것 같고 혹시 버전차이에 문제일수도 있나요? vue devtools에는 실시간으로 나타나는걸로 보입니다...
-
미해결코딩테스트 실전 모의고사(with C++) : 대기업 대비
BFS 코드 중에 이해가 안되는 부분이 있습니다.
import java.io.*; import java.util.*; class Solution { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static StringBuilder sb = new StringBuilder(); public static void main(String[] args) throws IOException { n = Integer.parseInt(br.readLine()); arr = new int[n][n]; check = new int[n][n]; check2 = new int[n][n]; Queue<Point> q = new LinkedList<>(); for(int i=0; i<n; i++){ String[] input = br.readLine().split(" "); for(int j=0; j<n; j++){ arr[i][j] = Integer.parseInt(input[j]); if(arr[i][j]==2) { q.add(new Point(i, j, 0)); check2[i][j] = 1; } } } /** * 3번 5번 케이스에서 하나씩 크게 결과가 나온다 * * while (!q.isEmpty()){ * Point poll = q.poll(); * * if(check[poll.x][poll.y] == 0){ * check[poll.x][poll.y] = 1; * for(int j=0; j<4; j++){ * int nx = dx[j] + poll.x; * int ny = dy[j] + poll.y; * if(nx>=0 && ny>=0 && nx<n && ny<n && check[nx][ny] == 0 && arr[nx][ny] == 0){ * q.add(new Point(nx,ny, poll.cnt+1)); * res = Math.max(res, poll.cnt+1); * } * } * } * } */ while (!q.isEmpty()){ Point poll = q.poll(); for(int j=0; j<4; j++){ int nx = dx[j] + poll.x; int ny = dy[j] + poll.y; if(nx>=0 && ny>=0 && nx<n && ny<n && check2[nx][ny] == 0 && arr[nx][ny] == 0){ check2[nx][ny] = 1; q.add(new Point(nx,ny, poll.cnt+1)); res = Math.max(res, poll.cnt+1); } } } System.out.println(res); } static int dx[]= {-1,1,0,0}, dy[]= {0,0,-1,1}; static int res = 0, n; static int arr[][], check[][], check2[][]; static class Point{ int x, y, cnt; Point(int a, int b, int c){ x=a; y=b; cnt=c; } } } 주석 코드로 BFS를 돌리면 3번과 5번 케이스에서 실패합니다. 선생님의 코드를 참고해서 check 배열을 이용하는 검증부분만 순서를 바꿔서 해결했는데요. 결국 이해는 못해서 두가지 코드 모두 동일한 알고리즘으로 보입니다 ㅠㅠ 명쾌한 답변 가능할까요
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
[작업형1_모의문제3_8번 문제] reset_index() 와 groupby 의 as_index=False 에 대해
해설에서는 reset_index 을 사용했는데groupby 에서 as_index = False 로 사용해도 될까요? 일단 결과는 같게 나오는 것 같은데이 둘이 원래 결과가 같게 나오는건지 궁금합니다.as_index : 그룹화된 열을 인덱스로 사용하지 않음reset_index : 기존의 인덱스를 컬럼으로 추가하고 새로 인덱스 생성(인덱스 초기화)이렇게 알고 있습니다.groupby 의 as_index=False 인자df.groupby(['city', 'f2'], as_index=False).sum(numeric_only=True)reset_index 메소드df.groupby(['city', 'f2']).sum(numeric_only=True).reset_index()