묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 데이터 JPA
페치조인과 new 프로젝션
Member Entity@Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Builder @AllArgsConstructor @ToString(of = {"id", "username", "age"}) @NamedQuery( name = "Member.findByAgeGreaterThanAndUsername", query = "select m from Member m where m.age > :age and m.username = :username" ) public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; private String username; private int age; /** * 연관관계 편의 메서드 */ public void changeTeam(Team team) { this.team = team; team.getMembers().add(this); } } Team Entity@Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Builder @AllArgsConstructor @ToString(of = {"id", "name"}) public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "team_id") private Long id; @OneToMany(mappedBy = "team", fetch = FetchType.LAZY) @Builder.Default private List<Member> members = new ArrayList<>(); private String name; } MemberRepositorypublic interface MemberSpringJpaRepository extends JpaRepository<Member, Long> { List<Member> findByUsernameAndAgeGreaterThan(String username, int age); @Query(name = "Member.findByAgeGreaterThanAndUsername") List<Member> findByAgeGreaterThanAndUsername(@Param("age") int age, @Param("username") String username); @Query(value = "select m from Member m") List<Member> findUsers(); @Query(value = "select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) from Member m join m.team t") List<MemberDto> findMemberDtoWithJoin(); /** * fetch join -> new 프로젝션 예외 터짐 */ // @Query(value = "select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) from Member m join fetch m.team t") // List<MemberDto> findMemberDtoWithFetchJoin(); @Query(value = "select m from Member m join m.team t") List<Member> findMemberJoinWithTeam(); } 질문 /** * join -> new 프로젝션 정상 수행 */ @Query(value = "select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) from Member m join m.team t") List<MemberDto> findMemberDtoWithJoin(); /** * fetch join -> new 프로젝션 예외 터짐 */ // @Query(value = "select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) from Member m join fetch m.team t") // List<MemberDto> findMemberDtoWithFetchJoin();@Query 애너테이션에서 쿼리문을 작성할 때, new 연산자를 사용하여 dto로 변환하여 반환하려고 합니다. Member-Team을 join 후 new 연산자를 사용하여 dto는 정상적으로 반환이 됩니다. 근데 페치조인을 사용 후 new 연산자를 사용하면 아래 예외가 터집니다.fetch join으로는 new 연산자 사용이 안 되는 이유를 알고싶습니다. 발생하는 예외java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@3d1b6816 testClass = study.datajpa.repository.springjpa.MemberSpringJpaRepositoryTest, locations = [], classes = [study.datajpa.DataJpaApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@1255b1d1, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@47da3952, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@28a0fd6c, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@5fb97279, org.springframework.boot.test.context.SpringBootTestAnnotation@3f26d230], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원 웹 기능 조회
회원 웹 기능 조회에서 잘 따라가다가 아래 처럼 model에서 오류가 뜹니다.. 뭐가 잘못되었을 까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
localhost8080 연결 거부
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]view 환경설정에 코드 resources/static/index.html 코드 복사해서 치고 실행돌린 후 localhost:8080 돌렸는데도 자꾸 연결 거부만 뜹니다..그리고 왜 코드도 저렇게 흰색으로 뜨는 지 잘 모르겟어요..뭐가 문제인가요 ㅠㅠ
-
미해결스프링 시큐리티 OAuth2
oidcLogoutHandler 작성할 때의 질문입니다!
안녕하세요.oidcLogoutHandler()는 말 그대로 scope에 openid가 포함되어 open id 방식으로 인증했을 때의 로그아웃 처리인데요.oauth2.0으로 로그인했을 때의 로그아웃 처리는 어떻게 하는지 궁금합니다. Oauth2ClientInitiatedLogoutSuccessHandler 같은 클래스는 없더라고요!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
섹션1 <View 환경설정> 강의 질문
templates 폴더의 hello.html 파일에서 <p>태그로 묶여있는 "안녕하세요. 손님"은 화면에서 확인할 수가 없는 이유가 궁금합니다. Thymeleaf templates 엔진 처리를 통해 웹 브라우저에 무언가를 띄우려면 항상 th:text="'안녕하세요. ' + ${data}" 이런 식의 문법을 사용해야 하나요?
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
MSA 강의는 언제쯤 업데이트 될까요?
이 강의와 연속성이 있는 강의라서 여쭤봐요!!
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
프록시 관련 질문이 있습니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요.김영한 선생님. 선생님의 강의를 잘 듣고 있습니다.현재 AOP 적용 부분에서 프록시 부분에 대한 설명을 듣고 있었는데요, 선생님께서는 프록시가 컨트롤러 내부에서 형성되어 그 프록시가 실질적인 서비스 부분으로 요청을 넘겨주고 처리해 줄 것이다. 이런 느낌으로 말씀해주셨던 것 같습니다.여기서 조금 궁금했던 부분이 있습니다. 만약 다른 컨트롤러 파일 내부에서 같은 서비스에 대해서 AutoWired를 통해 의존성 주입을 받게 될 경우, 서비스를 연결하는 프록시가 컨트롤러마다 생길지에 대해서 궁금했었습니다.제가 생각하기에는 다른 프록시가 서로 나올 거 같은데, 로그를 찍어보았을 때는 두 컨트롤러가 같은 프록시를 공유하였습니다.혹시 프록시의 생성 기준은 서비스일까요 컨트롤러일까요? 또한 AOP를 사용하지 않는 경우 해당 파일은 프록시를 전혀 사용하지 않을까요? 그것이 궁금합니다.
-
미해결스프링 부트 - 핵심 원리와 활용
username만 다르게 뜹니다.
프로필 적용할 때부터 이렇게 username은 다르게 뜨는데 어떻게 해야될까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO내에 정적 팩토리 메서드를 생성해도 되는걸까요?
말그대로 컨트롤러 층에서 인스턴스 생성 코드를 작성하는 게 아니라Member 인스턴스 생성 메서드를 DTO내부에 만들어서 반환해도 될까요?
-
미해결1시간만에 끝내는 spring boot rest api 서비스 개발
mybatis의 hashmap 데이터 호출시 대문자로 불러와야 되나요?
강의 내용에 대해 질문해 주세요에러가 날 경우 본인 코드가 있는 git 주소를 알려주거나 최대한 상세히 적어주세요 소문자로하면 null로만 나옵니다...
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
테스트 오류
1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)스프링 데이터 jpa 테스트하면 오류가 뜨네요 뭐가 문제일까요ㅜㅜ
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
Override Methods가 존재하지 않는다고 뜨는데...
저번에 한번 질문을 드렸을 때, 해주신 답 덕분에 인텔리제이는 유료(정확힌 학생 버전으로)로 바꾸어서 해결했었는데...이번에는 여기서 안되는데... 이유가 뭘까요?
-
해결됨토비의 스프링 부트 - 이해와 원리
안녕하세요 토비님. 강의중 질문있습니다.
안녕하세요 강의 잘 듣고있는 학생입니다.다름이 아니라 applicationContext의 생성과정이 아직 스스로 정리가 되어있지 않아 이렇게 질문을 드립니다..우선 제 생각은 이렇습니다.applicationContext를 생성하면서 내부적으로 onRefresh() 를 오버라이딩을 합니다.여기서 ServletWebServerFactory serverFactory = this.getBean(ServletWebServerFactory.class); DispatcherServlet dispatcherServlet = this.getBean(DispatcherServlet.class); 을 통해서 등록된 Bean을 들고오게 됩니다.여기서 드는 의문점1은, this.getBean(DispatcherServlet.class)을 한다는 것은 이미 DispatcherServlet이 Bean등록이 되어있다는 것이고 그렇다면 applicationContext라는 변수를 만들기 전에 이미 Bean이 등록이 되어있었다고 생각됩니다. 그러면 applicationContext라는 변수를 방금 막 선언하고 아직 객체를 할당하는 과정인데 this.getBean이 작동한다?this는 분명 applicationContext인데 어떻게 applicationContext안의 getBean을 통해 dispatcherServlet등이 불러와지는지 모르겠습니다.. (요약하면, 아직 인스턴스를 만들지 않았는데 어떻게 applicationContext안의 getBean이 동작할 수 있는가? 입니다) 두번째는, 어떻게든 위의 과정을 거쳐서 applicationContext(스프링 컨테이너)가 서블릿 컨테이너와 연결이 되었습니다. 이후 applicationContext.register(HellobootApplication.class)를 하게되는데, 이미 위에서 빈 등록도 다 하고 모든걸 가지고 있는것 같은데 왜 register가 필요한것인지 모르겠습니다 ㅠㅠ register하는 코드는HellobootApplication.class라는 클래스 구성정보를 읽어서 그 내용을 토대로 빈(이때 이 빈은 HellobootApplication 빈 일까요??)을 등록한다 라고 생각되는데, HellobootApplication 클래스의 정보에는 팩토리 메서드 2개(ServletWebServerFactory,DispatcherServlet) 와 applicationContext를 구성하는 코드밖에 없다고 생각됩니다. applicationContext를 구성하는 과정에서 이미 팩토리 메서드 정보를 사용한 것 같은데, 그렇다면 이미 빈을 만드는데 필요한 정보는 다 가지고 있는것이 아닌가? 라고 생각이 듭니다. 이런 부분들이 자꾸 맘에 걸려서 다음강의로 못넘어가겠습니다 ㅠㅠ 명확하게 정리해주시면 감사하겠습니다..
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
DTO 관련 질문있습니다.
안녕하세요 ~자바 개발자 경력자인데요.먼저 그냥 코딩을 이때까지 해왔지만 이렇게 기초부터 차근차근 비유해주시면서 설명해주시니 다시 개념확립이 되는것같아 감사드립니다.일단 제가 궁금한점이 SI 이나 이떄까지 회사 프로젝트를 다녀본결과 .. 예를들어 쿼리결과를 저장하고 , API 사용시 (요청 /결과)모두 이때까지 VO 라는 클래스를 만들어 사용하고 보았는데요.이전부터 DTO , VO 두개의 차이점의 개념은 알고 공부하고 알고는 있었느나 , 항상 이때까지 모든 프로젝트에서는 모든 클래스를 뒤에 UserVO , DetailVO ... 이렇게 사용하곤했는데요.아직까지도 아직경험을 못해서그런지 VO vs DTO 개념이 확립이안되네요;앞으로 프로젝트참여시 VO 를 DTO 라고 명칭만 바꿔서 사용하면될까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
gateway 예외처리
안녕하세요!강사님 강의를 듣고 msa 적용하는 프로젝트를 진행중인데, 프로젝트 controller단 전역에서 발생하는 예외를 처리하고 싶어 @@RestControllerAdvice를 활용하려고 생각중입니다.msa에서 예외를 전역으로 처리하려면 gateway에서 @RestControllerAdvice를 활용해야 될까요? 아니면 각각의 마이크로서비스마다 @RestControllerAdvice를 활용해야 될까요?둘중 어떤 설계가 더 효율적일지 답변주시면 감사하겠습니다🙏🙏
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
안녕하세요 사용자 전체 목록 보기 count, users 리스트를 반환하도록 하는 것에 대한 질문입니다.
response { "count": 5, "users": [ { "id": 90001, "name": "User1", "joinDate": "2024-02-04T07:40:02.160+00:00" }, { "id": 90002, "name": "User2", "joinDate": "2024-02-04T07:40:02.163+00:00" }, { "id": 90003, "name": "User3", "joinDate": "2024-02-04T07:40:02.163+00:00" }, { "id": 90004, "name": "User4", "joinDate": "2024-02-04T07:40:02.164+00:00" }, { "id": 90005, "name": "User5", "joinDate": "2024-02-04T07:40:02.164+00:00" } ]}hashmap 에 담아서 결과값을 반환해주는 식으로 했는데..상황에 따라 다르겠지만 의도하신 정답에 가까울까요..?
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
조회 관련 질문입니다.
안녕하세요 강의 잘 듣고 있습니다. 강의를 듣다가 의문이 생겨 질문 남깁니다. CartServiceImpl 에서 addOrModify() 를 보면 처음에 cino 가 null 값이 아닌 경우 cartItemRepository.findById 를 하시고, null 값인 경우에는 getCart() 후에 getItemOfPno() 를 하셨습니다. cino 가 null 이면 CartItem 이 존재하지 않는다고 생각되어 다시 getItemOfPno() 를 할 필요가 없다고 생각했는데 위와 같이 코드를 작성하신 이유가 궁급합니다. 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberRepository 구현 시, findAll() 메서드 질문 드립니다.
public List<Member> findAll(){return new ArrayList<>(store.values());} 반환되는 List도 결국 인덱스에 store에 저장된 객체의 주소 값을 저장하기 때문에 해당 list를 통해서 내부 객체를 수정하게 되더라도 store내부에 있는 객체도 수정이 이루어지니깐 다를게 없다 느껴졌는데 store를 직접반환하는 것과 어떻게 다른가요?..
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
제가 강의 내용을 제대로 이해하지 못한 것 같습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]@Query("select r from Review r join fetch r.user u join fetch r.reviewReviewTags rt join fetch rt.reviewTag where r.program.id=:programId order by r.likeCounts desc") List<Review> findTop4ByProgramOrderByLikeCountsDescWithFetch(@Param("programId") Long programId, Pageable pageable);안녕하세요!영한님의 강의에서 이해했던 내용과 결괏값이 달라서 질문 올립니다.(물론 제가 이해를 잘 못했을 것 같긴합니다!)현재 User, Review, Program 을 1대 다 다대1로 나누었고 중간테이블은 Review 입니다.또한 Review , RevieReviewTag, ReviewTag 또한 1대다 다대1. 중간테이블은 ReviewReviewTag 입니다.현재 강의 내용에서 제가 이해한 것은@OneToMany 에서 성능 최적화 할 때1)페이징 처리시 : Batch 를 활용2) 페이징 처리 안할 시: distinct+ fetch JOIN 사용입니다.위 경우에서 join fetch r.reviewReviewTags 에 주목해 주세요!이는 review 와 reviewreviewTag 즉 1대다입니다.이를 fetch Join 으로 한번 발라보았습니다. 저는 위 과정에서 일단 핵심적으로 distinct 를 안붙였기 때문에 같은 리뷰에 대한 리뷰 태그가 여러 개 생겨서 중복된 결과가 나올줄 알았습니다. 실제로 위 과정에서 나온 쿼리를 복사해서 집어 넣어보니 이렇게 추가된 같은 review에 대해서 reviewTag 개수(review에 대한 1대다,2개로 고정해서 저장하였음. 따라서 두번씩 중복) 만큼 중복해서 나왔습니다. 그래서 위 과정을 DTO로 만들어서 반환하면 2개씩 중복된 결과가 나올 것이라 예상했습니다. 근데 JSON 데이터를 확인한 결과 { "reviewId": 21, "like": 0, "contents": "너무 좋았습니다0", "userPosterPath": null, "userNickName": null, "localDateTime": "2024-02-04T03:40:18.924606", "ratings": "2.5", "reviewTagNames": [ "극장에서 또 보고 싶어요", "돈이 아까워요" ] }, { "reviewId": 22, "like": 0, "contents": "너무 좋았습니다1", "userPosterPath": null, "userNickName": null, "localDateTime": "2024-02-04T03:40:18.934169", "ratings": "1.5", "reviewTagNames": [ "극장에서 또 보고 싶어요", "돈이 아까워요" ] }, { "reviewId": 23, "like": 0, "contents": "너무 좋았습니다2", "userPosterPath": null, "userNickName": null, "localDateTime": "2024-02-04T03:40:18.939567", "ratings": "2.5", "reviewTagNames": [ "극장에서 또 보고 싶어요", "돈이 아까워요" ] }, { "reviewId": 24, "like": 0, "contents": "너무 좋았습니다3", "userPosterPath": null, "userNickName": null, "localDateTime": "2024-02-04T03:40:18.948736", "ratings": "0.5", "reviewTagNames": [ "극장에서 또 보고 싶어요", "돈이 아까워요" ] } ], 얼레레 근데 왠걸정상적으로 나오는 것입니다.저는 위에 쿼리를 DTO로 만들어서 반환한 것 밖에 없는데 (pageable 안에는 PageRequest.of(0, 4)) 제가 이해한 강의 내용 대로라면 일단 핵심적으로 distinct 를 안붙였기 때문에 1대다의 다의 개수만큼 중복된(위에서는 2개) 결과가 나와야 할 것 같았는데어디서 틀린 것일까요 ㅠ 스프링 부트 버젼은 2.7.X 이며 하이버 네이트 버젼도 6이 안되는 것을 참고해주세요 ㅜ
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
제가 이해한 것이 맞느지 확인 부탁드립니당
이번에 만든 조회하는 api는 리스트로 반환해야 하기 때문ㅇ JSON이어야 하고그렇기에 함수 반환 값이 List<UserResponse>인건가요?그리고 등록 api에서 만든 users리스트 수만큼 for문 돌려서 진정한 결과 리스트(id도 포함되어있는) reponses를 만들어낸건가요..?