inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

자바 코드로 직접 스프링 빈 등록하기

미해결

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

스프링 빈 만드는 법 @Controller @Configuration + @Bean

  • java
  • mvc
  • spring
  • spring-boot
도토리 댓글 1 좋아요 0 조회수 501

argument resolver 관련 질문

미해결

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

LoginMemberArgumentResolver의 supportsParameter 메소드에서 다음 코드를 통해 @Login 어노테이션이 붙은 파라미터의 타입을 체크한다고 강의에서 설명해주셨는데요. boolean hasMemberType = Member.class.isAssignableFrom(parameter.getParameterType()); 위 코드는 파라미터가 Member의 자식 타입인지 조사하하는 건데 그럼 @Login 어노테이션이 Member 자식 타입 파라미터에 붙는 경우 ClassCastException이 발생할 것 같습니다. 따라서 아래와 같이 쓰는 게 맞는 것 같은데 아닌가요? boolean hasMemberType = parameter.getParameterType().isAssignableFrom(Member.class);

  • MVC
  • spring
gunner6603 댓글 2 좋아요 2 조회수 827

낙관적 락 무한루프 도는 이유 공유합니다 !

해결됨

재고시스템으로 알아보는 동시성이슈 해결방법

MySQL을 사용한다면 Isolation Level이 REPEATABLE READ가 기본으로 설정되어 있는데요. 이 때 트랜잭션 안에서 처음 SELECT한 값은 트랜잭션이 끝나기 전까지 몇 번을 다시 SELECT해도 동일한 값으로 읽게 됩니다. 이것 때문에 문제가 발생하는데요... 트랜잭션 안에서 낙관적 락이 진행되도록 구현한 상황에서 쓰레드 100개가 동시에 재고를 감소 시키고, 업데이트에 성공하면 version을 1씩 증가시킨다고 해보겠습니다. DB에는 Stock이 100개 version이 1로 세팅되어 있다고 가정합니다. @RequiredArgsConstructor @Service public class ProductService { private final ProductRepository productRepository; @Transactional public void subtractStockOptimistic(int productId, int quantity){ int updatedCount = 0; while (updatedCount == 0){ Product product = productRepository.findById(productId); product.subtractStock(quantity); updatedCount = productRepository.updateStockOptimistic(product); if (updatedCount <= 0) { //업데이트에 실패한 경우 50ms 대기 try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } } } } <update id="updateStockOptimistic"> update test_product set stock = #{stock}, version = version + 1 where id = #{id} and version = #{version} </update> 쓰레드 100개는 처음에 재고를 읽어서 모두 다음 값을 받아옵니다. stock : 100, version : 1 제일 빠른 트랜잭션이 업데이트를 성공하고 DB는 다음과 같이 변합니다. stock: 99, version: 2 이제 나머지 99개의 트랜잭션은 version이 다르므로 모두 업데이트에 실패하게 됩니다. 업데이트에 실패하게 된 트랜잭션들은 재시도를 하게 됩니다. 이 때 DB에서 다시 읽어드린 재고는 stock: 99, version: 2일 것 같지만 실제로는 stock: 100, version: 1 를 읽게 됩니다. 왜냐하면 여전히 하나의 트랜잭션 안에 들어 있고, Isolation Level이 REPEATABLE READ로 처음 읽은 값을 계속 읽게 되기 때문입니다. 따라서 첫 트랜잭션을 제외한 모든 트랜잭션은 무한히 실패하게 됩니다....... 따라서 한 트랜잭션 안에서 업데이트와 재시도 로직이 진행되지 않도록 @Transactional을 메소드에서 떼주시면 정상 동작하게 됩니다. 혹시 정말 Isolation Level 때문인지 확인하고 싶으신 분들은 DB에 Isolation Level을 READ COMMITTED로 바꾸고 테스트를 진행해보시면 @Transactional이 붙어 있어도 정상 동작하는 것을 확인하실 수 있습니다~!

  • spring
  • java
  • 동시성
shef 댓글 1 좋아요 7 조회수 887

엔티티의 필드가 많을 때 업데이트 방법?

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

API 개발 기본 - 회원 수정 API 해당 강의 시리즈를 들으며 전 강의부터 생겼던 궁금한 사항에 대해 질문을 드립니다. 예제의 경우는 최대한 간단하게 간소화시킨 엔티티를 예시로 들었지만, 필드가 많은 엔티티의 경우에는 어떤 방식으로 업데이트를 하는지 감이 잡히질 않네요. // java @RequestMapping(value = "/v1/edit/{memberId}", method = RequestMethod.PUT) public EditMemberResponse editMemberV1(@PathVariable Long memberId, @RequestBody @Valid EditMemberRequest request) { memberService.update(memberId, request.getName()); ... return new EditMemberResponse(member); } 강의 내용 중 위와 같이 업데이트 파라미터에 DTO 필드를 받아 업데이트 하도록 서비스를 작성하셨는데, 단순히 이름만 있는 엔티티 클래스가 아닌 필드가 굉장히 많은 엔티티의 경우에는 어떤식으로 업데이트 처리하는 것이 효율적일지 궁금해서 질문을 드립니다. @Entity public class Temp { @Id @GeneratedValue private Long id; private String field01; private String field02; // ...무수히 많은 필드들 private String field66; private String field67; } 예를들어, 위와 같은 Temp 클래스의 경우를 업데이트 하기 위해 앞서 설명한 방식으로 업데이트 기능을 서비스계층에 구현한다면 아래와 같이 실질적으로 사용이 불가능할정도로 가독성과 생산성이 떨어졌습니다. // java tempService.update( editTempRequest.getField01(), editTempRequest.getField02(), editTempRequest.getField03(), editTempRequest.getField04(), ..., editTempRequest.getField67() ); 아래와 같이 서비스 계층에 EditTempRequest DTO 계층 클래스를 직접 넘기는 방법도 생각을 해보았습니다만, 서비스 계층에서 DTO 클래스를 이용하기 위해 컨트롤러 계층에서 이너 클래스로 선언된 DTO를 별도의 public 클래스로 선언해주어야 되므로 별도의 자바 파일과 패키지를 구성하게 되어 불필요한 복잡도가 증가하는 문제가 발생했습니다. 또한, 단순히 요청, 응답을 위해 데이터를 담는 목적으로 사용되어야 하는 DTO 클래스의 역할과 책임이 확장되는 문제도 생겼습니다. // java import com.wahhahaha.controller.dto.editTempRequest; ... tempService.update( editTempRequest ); 클라이언트 측에서 수정 API를 호출하기 전에 조회 API를 우선 호출하여 각 필드 정보를 가진 상태로 전체 필드를 이용한다면 merge 업데이트로 쉽게 해결이 가능하겠다라는 생각을 해보긴 했지만 merge는 가급적 이용하지 않는 편이 좋다는 전 강의 내용이 있어 혼란스럽네요.

  • 수정
  • 업데이트
  • JPA
  • java
  • springboot-jpa
  • spring
  • spring-boot
roman14 댓글 2 좋아요 3 조회수 1410

hibernate 버전

해결됨

스프링 DB 2편 - 데이터 접근 활용 기술

안녕하세요 영한님, 서포터즈님들 이전 Spring Data JPA에서 hibernate 버전으로 인해서 % like 연산이 제대로 동작하지 않아서 버전을 바꿔줬었습니다. 그런데 이번 강의에서 hibernate 버전을 변경하지 않아도 테스트가 제대로 동작을 했습니다. 제가 알고 있는 바로는 querydsl은 jpql을 사용하기 쉽게, 컴파일 타임 때 에러를 잡을 수 있게 도와주므로 결국 querydsl -> jpql -> jpa -> hibernate 요렇게 진행방식(?)이 된다고 생각했습니다. 그러면 저번에 spring data jpa에서 제대로 테스트 되지 않았던 findItem이 querydsl 을 사용할 때도 안되야하지 않나라는 생각이 들어서 질문드립니다 감사합니다

  • spring
gusdn85554 댓글 2 좋아요 0 조회수 2967

MVC패턴 적용 동영상 중 똑같이 했는데 에러페이지가 떠서

미해결

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. MVC패턴 - 적용 15분 07초 의 내용인데요.. 똑같이 작성 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 성공 <ul> <li>id= <%=((Member)request.getAttribute("member")).getId()%> </li> <li>username= <%=((Member)request.getAttribute("member")).getUsername()%> </li> <li>age= <%=((Member)request.getAttribute("member")).getAge()%> </li> </ul> <a href="/index.html">메인</a> </body> </html> 에러페이지가 나와요 ?? 몇번을 확인해봐도 15분 07초 내용과 똑같이 작성했는데 그러네요.. 그런데 ${ } 로 작성해보면 또 아래와같이 재대로 나와요 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 성공 <ul> <li>id= ${member.id} </li> <li>username= ${member.username} </li> <li>age= ${member.age} </li> </ul> <a href="/index.html">메인</a> </body> </html> 질문 : 위에 request.getAttribute로 가져올때 분명 강사님은 제대로 실행했는데 전 왜 똑같이 따라했는데 안되고 ${ } 방법으로 했을때만 제대로 실행될가요??

  • spring
  • MVC
김현종 댓글 3 좋아요 0 조회수 727

clientRegistration이 null로 뜹니다.

미해결

스프링 시큐리티 OAuth2

디버그 모드 상태에서 보면, clientRegistrationRepository에 객체가 존재하고, 관련 설정값들이 확인이 되고있는데, 이것이 변수에 저장되지 못하고null이 되고 있습니다. 따라서, clientId 같은 속성들도 확인이 불가능 합니다. 컨트롤러에서는 해당 의존성을 사용하지 않으면 일단 기능은 작동되니 사용하고있지 않으나, 컨트롤러에서 clientRegistration를 사용할수 없는 상황입니다.

  • java
  • spring
  • oauth
  • spring-boot
이승규 댓글 2 좋아요 0 조회수 437

트랜잭션 ReadOnly 컨트롤 질문드립니다.

미해결

스프링 DB 2편 - 데이터 접근 활용 기술

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] Transaction을 어노테이션으로 설정하는 방법 중에 궁금한 점이 있습니다. 트랜잭션으로 선언하지 않은 메소드에서 트랜잭션로 선언한 내부 메서드를 불러오는 경우 AOP를 통하지 않기 때문에 @Transactional이 적용되지 않는다는 것은 이해하였습니다. 그리고 이 문제를 해결하기 위해 Class를 분리하여 주입해주는 방법으로 Proxy 클래스에서 메서드를 가져오는 것도 확인하였습니다. 확인을 위해 테스트를 작성하던 중 ReadOnly관련해서 질문이 생겼는데요. 트랜잭션을 ReadOnly를 True로 선언한 첫 번째 메서드에서 ReadOnly를 False로 선언한 두번째 메서드를 부룬뒤, 트랜잭션 매니저의 isCurrentTransactionReadOnly가 True에서 False로 변경되지 않을까 하였는데요. 생각과는 달리 변경되지 않는 것을 확인하였습니다. 이런 경우에는 첫번째 트랜잭션으로 이미 감싸져 있는 상태이기 때문에 두번째 트랜잭션이 무시된 것일까요? 그리고 TransactionSynchronizationManager.setCurrentTransactionReadOnly 메서드를 통해 ReadOnly의 속성을 변경할 수 있는 것을 확인하였는데, 실무에서 이렇게 TransactionSynchronizationManager를 통해 속성을 변경하여 사용하는 경우가 있을까요? readOnly로 하여 많은 데이터를 가져온 후, 결과를 입력하는 경우에 데이터를 readonly로 가져오는 것이 빠르기도 하고 전체 프로세스를 같은 트랜잭션을 사용해 조금 유용하지 않을까 하여 질문드립니다.

  • spring
박세준 댓글 3 좋아요 1 조회수 1796

form-start과녈ㄴ하여 여쭙습니다.,

미해결

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

안녕하세요. Form start를 처음 시작하는데 있어 어려움이 있어서 여쭙습니다. 강의 목차 상에서 소스코드 다운 mvc2_source_v20210624\__MACOSX\mvc2\form-start 해당 경로 파일에서build,gradle 파일이 아닌가요 여러차례 오픈해보았는데 하기와 같은 화면만 조회되고 프로그램이 실행되지 않아서 여쭙습니다.. ㅠㅠ

  • spring
  • MVC
댓글 1 좋아요 0 조회수 774

tipp) css 적용 안되시는분들

미해결

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

boot strap 사이트에서 css js 폴더 복붙했는데 안되시면 (버젼 문제일수 있다고 해요) 해결 방법은 다음과 같습니다. 방법: 강의 자료에서 코드 다운 받고 아래 폴더에서 css jss 폴더 찾으신다음 그대로 static 에 복붙하고 reload disk 한번 해주시면 될거에요 ex) jpashop-v20210728\src\main\resources\static

  • java
  • 웹앱
  • JPA
  • spring-boot
  • spring
terecal 댓글 7 좋아요 29 조회수 3102

datasource를 썼을 때 jdbc 인터페이스는 어느 위치에 들어가나요?

미해결

스프링 DB 1편 - 데이터 접근 핵심 원리

"jdbc인터페이스"를 쓰면 아래와 같이 연결이 되고 애플리캐이션로직 jdbc인터페이스 mysql드라이버 mysqlDB "datasource"를 쓰면 아래와 같이 연결이 되는데 애프릴캐이션로직 Datasource 커넥션풀 DB datasource를 썼을 때 jdbc 인터페이스는 어느 위치에 들어가게 되나요?

  • spring
g g 댓글 2 좋아요 2 조회수 541

label, page, button등에 대한 질문이 있습니다.

미해결

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

label이라고 해주는 기준이나, page라고 해주는 기준이나, button의 기준을 모르겠습니다. 단순 명시상인건지, button이면 button.save라고 해줘야 하는지요? 또한 label.item.itemName처럼 .[온점]을 두 번이나 찍었는데, 이 .찍는 기준이 어떻게될까요?ㅠ

  • MVC
  • spring
코딩이재미있어! 댓글 1 좋아요 1 조회수 366

maven으로 생성한 docs파일(index.html)에서의 not found 오류 질문

미해결

스프링 기반 REST API 개발

안녕하세요. 백기선님 강의 덕분에 성장 중입니다. 강의 항상 감사합니다. 다름이 아니라, 인텔리제이의 maven 메뉴에 있는 package로 생성된 index.html 에 있는 내용들이 not found operator:: 라면서 오류가 납니다. pom.xml, test에 있는 createEvent(), EventController 에서 틀린 부분이 있는지 찾아봤는데도 분명 소스는 같은데 왜 틀리는지 잘 모르겠습니다. 제가 아직 not found operator:: 이 부분이 무슨 뜻인지 몰라서일까요... 테스트는 일단 잘 돌아갑니다(?) 현재 사용 중인 버전은 아파치 메이븐 3.8.1 (약 2018년 버전으로 예상) 스프링 부트 2.6.13 입니다. 도와주시면 감사드리겠습니다🙇‍♂️ 소스는 링크로 걸어놓겠습니다. (pom.xml 외 다른 소스들은 실습 중이라 달라질 수 있습니다) EventController https://github.com/intrager/Spring-STUDY2/blob/main/restfulHan/src/main/java/me/brucehan/restfulhan/events/EventController.java RestDocsConfiguration https://github.com/intrager/Spring-STUDY2/blob/main/restfulHan/src/test/java/me/brucehan/restfulhan/common/RestDocsConfiguration.java EventControllerTests https://github.com/intrager/Spring-STUDY2/blob/main/restfulHan/src/test/java/me/brucehan/restfulhan/events/EventControllerTests.java pom.xml https://github.com/intrager/Spring-STUDY2/blob/main/restfulHan/pom.xml index.adoc https://github.com/intrager/Spring-STUDY2/blob/main/restfulHan/src/main/asciidoc/index.adoc

  • rest-api
  • java
  • spring
Bruce Han 댓글 1 좋아요 0 조회수 662

엔티티나 임베디드 타입 개발

미해결

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

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 강의 자료에 JPA 스펙상 엔티티나 임베디드타입은 자바 기본 생성자를 public 또는 protected로 설정해야 한다고 나와있습니다. 그리고 protected로 설정하는 것을 추천해주셨는데요. 쉽게 말해서 모든 엔티티나 임베디드타입을 개발할때 @NoArgumentConstructor를 넣어주면 괜찮을까요?

  • 웹앱
  • spring-boot
  • JPA
  • java
  • spring
소니소니 댓글 1 좋아요 1 조회수 310

getBeansOfType 자동완성

해결됨

스프링 핵심 원리 - 기본편

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 스프링 빈 조회 - 상속관계에서 코딩 따라하는 중에, getBeansOfType 을 치고 안에 ~.class 를 입력하면 Map<String, ~> ... 와 같은 부분이 자동 입력되는 것을 보았습니다. 하지만 제가 동일하게 작업하면 아무리해도 자동입력이 되지 않아 계속 일일이 손으로 코딩하고 있습니다. 혹시 방법이 있는건지 알고싶습니다.

  • spring
  • oop
gkdsldk 댓글 1 좋아요 1 조회수 307

memberRepository과 itemRepository의 차이

미해결

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

관련질문을 봐도 이해가 안가 질문드립니다. itemRepository.getid를 하는데 어떻게 null값이 들어있을 수 있는지 궁금합니다.

  • spring
  • java
  • 웹앱
  • spring-boot
  • JPA
댓글 1 좋아요 0 조회수 431

service와 entity 서비스 로직 질문

미해결

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

addStock함수가 entity안에 있어 응집력이 좋아진다는 설명은 이해가 되었습니다. 그런데 어쩔때는 entity에 있어야 되고 어쩔때는 service에 작성해야하는지 그에 대한 기준을 잘 모르겠습니다.

  • JPA
  • 웹앱
  • java
  • spring-boot
  • spring
댓글 1 좋아요 1 조회수 477

면접에서 DI가 뭐냐고 물어보면 어떻게 대답하죠?

미해결

스프링 핵심 원리 - 기본편

어떤 클래스가 인터페이스에 의존하고 있을 때 어떤 구현객체를 주입할지는 오직 외부의 설정에서 결정되는 것을 의미합니다. 라고 대답하면 될까요 ㅠㅠ? 코드로는 이해가 어느 정도 된 거 같은데 말로 설명하려 하니 어렵네요 ....

  • oop
  • spring
g g 댓글 1 좋아요 0 조회수 629

강사님 스프링 데이터 JPA에 대해 질문있습니다.

해결됨

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

안녕하세요 강사님 항상 강의 잘 보고 복습하고 있습니다. 다름이 아니고 책 463p중에 find() VS JPQL이라는 목차가 있습니다. 그리고 이번 회차에서 설명하진 스프링 데이터 JPA를 듣고, 궁금한점이 생겨서 질문드립니다. 책 545p중 '스프링 데이터 JPA는 메소드이름을 분석해서 JPQL 생성하고 실행한다' 라고 하셨으니 그럼 JpaRepository를 상속받은 Repository에 만든 모든 메소드는 먼저 영속성컨텍스트를 확인하지 않고 DB의 sql를 보낸 뒤 결과값을 영속성컨텍스트에 존재하는지 비교하는게 맞나요? 스프링데이터 JPA의 사용을 적극 권장한다는 문구도 책에 있어서, 그렇다면 강사님은 따로 em을 필드선언후 find하는 경우는 없으신가요? 있다면 em하고 Repository도 동시에 필드생성해서 사용하는 상황은 어떤경우일까요?

  • spring-boot
  • spring
  • JPA
  • java
승윤 댓글 1 좋아요 3 조회수 743

memberrepository와 memorymemberrepository의 관계

미해결

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

두 파일 사이의 관계가 잘 이해가지 않습니다. MemberRepository 에 interface만 생성한 후 구체적인 함수는 MemoryMemberRepository 에 구현하는 건가요? 왜 같은 내용을 다른 파일에 저장하는지 잘 모르겠습니다.

  • java
  • spring
  • MVC
  • spring-boot
이시현 댓글 1 좋아요 0 조회수 517

인기 태그

인프런 TOP Writers

주간 인기글