묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
리턴 값을 받지못함.
이렇게 계속 못잡아주고있습니다 이럴 때는 어떻게 해결해야하나요 ㅜ
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Batch Size에서 두 번째 Order의 ID가 IN 쿼리에 들어가는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 처음 OrderItem을 조회할 때 두 번째 Order의 ID(11)와 함께 IN 쿼리를 통해 조회됩니다. 여기서 IN 쿼리에 두 번째 Order의 ID가 들어가는 이유에 대해 생각해보았습니다. 1. 현재 Order 엔티티를 통해 OrderItem을 조회하고 있다. 2. batch가 설정되어 있기 떄문에 1차 캐시에 들어있는 Order들을 통해 최대 batch_size개 까지 IN 쿼리를 통해 조회한다. 3. 조회 대상이 된 1차 캐시에 들어있던 Order들 중에 두 번째 Order가 포함되어있었기 때문에 IN 쿼리에 두 번째 Order의 ID가 함께 들어갔다. 4. member와 delivery를 fetch하지 않았을 때도 위와 같은 이유로 한번에 조회되었다. 이런 과정을 거쳐서 같이 조회가 되지 않았나 생각해보았습니다. 제가 생각한 이유가 맞거나 혹시 틀린 부분이 있는지 궁금합니다. 감사합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
실행환경 트랜잭션
영한님 안녕하세요. 테스트 환경에서 트랜잭션을 하는 방법은 이해하겠는데, 예제 코드의 실행환경에서는 트랜잭션 처리를 해줘야 하지 않나요? JdbcTemplate이나 MyBatis 관련 코드는 실행환경에서 따로 Transaction 처리를 해주는 게 없어서 그런데 따로 이유가 있어서 추가하지 않으신 건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
프로젝트 열 때, build.gradle 을 생성하는 이유
안녕하세요, 먼저 수업 정말 잘 듣고 있습니다 :) https://www.inflearn.com/questions/394903 저도 비슷한 에러를 겪었는데 (저는 빌드는 되는데 sonarlint 라고 코드 에러를 리뷰해주는 프로그램에서 비슷한 warning 메시지를 주었습니다) 조언해주신 대로 프로젝트를 열 때 build.gradle 을 열어서 해결했습니다. 저는 프로젝트 작업을 할 때, recent project 로 주로 꺼내오는(?) 편인데요 (혹은 인텔리제이를 닫지 않고 계속 작업하기도 합니다) 프로젝트를 가져올 때, build.gradle을 open 하는 것과, open 프로젝트 폴더 이름 혹은 open recent project 하는 것의 차이가 있는지 궁금합니다.
-
해결됨스프링 핵심 원리 - 기본편
컴포넌트 스캔 방식을 이용하면 @Bean 어노테이션을 쓸 필요가 없는건가요
컴포넌트 스캔 방식 말고, AppConfig와 같은 설정파일에 수동으로 직접 빈을 등록하는 경우 @Bean 어노테이션을 써서 스프링 컨테이너에 빈을 직접 등록했는데, 컴포넌트 스캔 방식을 활용하면 이런 @Bean 어노테이션을 쓸 필요가 없는것이지요?? 그럼 @ComponentScan 과 @Bean 이 두개의 어노테이션은 표기만 다른것이지 결국 똑같은 일?(빈 등록)을 하는 녀석들인건가요 ..! (너무 기본적인 질문같아서.. 죄송합니다)
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@Service @Repository 해주는 이유
안녕하세요. 강의 잘 듣고 있습니다. Service 코드와 Repository 코드 관련해서 의문이 하나 있는데요. ItemServiceV1이나 JdbcTemplateItemRepository, MyBatisItemRepository 등등에 @Service랑 @Repository를 해주는 이유는 뭔지 알 수 있을까요? (JdbcTemplate, MyBatis)Config에서 새로운 ItemService와 ItemRepository를 받아서 빈으로 만들어지 거면, @Service나 @Repository는 필요 없는 게 아닌지... 혹시 다른 이유가 있으신가요? @SpringBootApplication(scanBasePackages = "hello.itemservice.web") 그리고 이 코드 때문에 @Service랑 @Repository를 붙여도 ComponentScan 대상에 제외되기 때문에 @Service랑 @Repository가 필요없을 거 같은데 아닌가영?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2연결
(사진)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
에러
안녕하세요.Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-06-29 21:39:03.114 ERROR 10435 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : 라는 문구가 콘솔창에 뜨며 안됩니다.. 왜 그런 것인가요..?ㅜ 인텔리제이로 하고있습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링 프로젝트 삭제
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]여기에 질문 내용을 남겨주세요. https://start.spring.io/ 여기서 스프링부트 프로젝트 생성을 했습니다. 이후 인텔리제이를 삭제했다가 다시 깔았더니 생성한 프로젝트가 열리지 않아 삭제하고 다시 생성하고 싶은데 삭제자체가 안됩니다. 최근 생성한 프로젝트 목록에서 delete를 눌렀는데 제 파일 안에는 그대로 프로젝트 파일이 남아있고 삭제를 하려고 하면 권한이 필요하다고 삭제가 안됩니다. 이 경우 어떻게 해야 하나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
안녕하세요 강의 잘듣고있는데 질문이있어요
<script th:inline="javascript"> [# th:each="user, userStat : ${users}"] var user[[${userStat.count}]] = [[${user}]]; [/]</script> 이부분에서 마지막에 [/] 은 왜적어준건가요? 혹시 몰라서 삭제하고 실행해봤더니 오류가 나더라고요. 꼮있어야하는부분인가요 그렇다면 이유는 무었인가요?
-
미해결
서울시뉴딜일자리_IT인턴 3개월 [급여월260만]지원사업안내_빅데이터 기반 서비스플랫폼 과정 [스터디,프로젝트,프론트엔드,백엔드,자바,코딩]
서울시에서 뉴딜일자리사업 일환으로 2차 서비스플랫폼개발자 양성과정으로 3개월 인턴십 (급여 월 260) 보내주는 프로그램 진행중인데 신청해보세요! 자세한 내용은 https://blog.naver.com/kjc_sh/222775806456 참고해주세요~
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
validation
2분45초쯤에 itemName이 나온 과정이 스프링 부트가 LocalValidatorFactoryBean을 Validator에 등록한후 컨트롤러에 @Validated를 타고 FieldError를 생성후 BindingResult에 담겨진 객체의 필드명을 에러코드메시지 파라미터에 넘겨줘서 itemName 공백x 라고 표시가 된건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Long, long 타입 질문드립니다.!
안녕하세요 강의중 질문이 있어 문의드립니다. Member 클래스에서는 Long 클래스타입으로 사용되고 MemberRepository 클래스에서는 long 프리미티브타입으로 사용되는데 이것이 각 클래스의 어떠한 특성,성질 때문에 이렇게 사용되는 것인가요?? public class Member { private Long id; // 생략} public class MemberRepository { private static long sequence = 0L; //생략}
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
hello.html에서 ${data} 빨간줄
안녕하세요. 강의 정말 잘 듣고있습니다! 다름이 아니라 아..마..도? devtools dependency를 추가해주고 난 다음 발생한 것 같은데 hello.html에서 ${data} 빨간줄이 그어져 있네요. 마우스로 갖다 대보니 cannot resolve 'data'라는 문구가 뜨지만 실행 시키면 콘솔 창에 별다른 오류도 없고 devtools 등 전부 정상 작동 합니다. 어떤 것 때문에 그런것일까요??
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderService에서 itemService ItemRepository를 주입하는 것에 대해서 질문이 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]김영한 멘토님 덕분에 스프링에 대해서 쉽게 공부할 수 있어서 항상 감사함을 느끼고 있습니다.멘토님의 강의를 복습하던 중 궁금한 것이 생겨서 질문 남깁니다.제가 의구심을 가지는 코드 부분은 다음과 같습니다. @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class OrderService { private final MemberRepository memberRepository; private final OrderRepository orderRepository; private final ItemRepository itemRepository; /** 주문 */ @Transactional public Long order(Long memberId, Long itemId, int count) { //엔티티 조회 Member member = memberRepository.findOne(memberId); Item item = itemRepository.findOne(itemId); .... } .... } @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class ItemService { private final ItemRepository itemRepository; .... public Item findOne(Long itemId) { return itemRepository.findOne(itemId); } } @Repository @RequiredArgsConstructor public class ItemRepository { .... public Item findOne(Long id) { return em.find(Item.class, id); } } 여기서 제가 궁금한 점은 OrderService에서 ItemService 대신 itemRepository를 주입한 이유가 궁금합니다! 물론, 둘 다 실행은 동일하게 되지만, itemRepository를 ItemService에서만 접근하게 하고, 타 클래스에서 item에 관한 로직은 무조건 ItemService으로만 접근하는 식으로 해야 item에 관련된 로직들이 응집도가 높아지고, 모듈 간 결합도가 낮아지지 않을까요?? 멘토님의 의견이 궁급합니다!
-
미해결스프링 핵심 원리 - 기본편
appconfig
안녕하세요 김영한 개발자님 강의를 복습하다가 궁금한 점이 생겨서 질문남깁니다. appconfig class에서, 아래 코드 public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(new MemoryMemberRepository()); } } ... 처럼 구현 객체를 생성하고 연결하는 책임을 가진다고 하셨는데, 그럼 제 생각에는 MemberServiceImpl 클래스가 생성되기 전에 AppConfig 클래스가 먼저 실행되어야 한다고 여겨집니다. 그런데 코드 어느 부분에서도(MemberApp, OrderApp 제외) Appconfig 클래스를 호출하는 부분이 없어서 매커니즘(?)이 궁금했습니다. appConfig라는 이름의 클래스가 있으면 스프링이 자동으로 실행시켜주는 것인지, 아님 MemberApp, OrderApp과 같은 클래스를 만들어서 사용해야 하는 것인지 헷갈리는데 어떤게 맞을까요?! (여담이지만, 처음들었을 때 헷갈렸던 내용이 반복해서 들으니 이해가 자연스럽게 돼서 너무 감격스럽고 성장한 것 같아 행복합니다. 아직 궁금한점도 많고 부족하지만 꾸준히 공부하겠습니다. 좋은 강의와 항상 답변해주시는 서포터즈 분들도 감사드려요)
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
bindingReault.addError rejectedValue 값에 item.getPrice() 는 어떻게 전달되는건가요?
화면에서 qqq와 같은 문자열이 전달될 경우, bindingReault.addError 프로퍼티에 rejectedValue에 item.getPrice()를 넘기는데, qqq는 숫자가 아니여서 item 객체에 저장이 안되어 있는데 어떻게 넘어갈 수 있는 걸까요? log를 찍어보면, item.getPrice()=null 인데요. @PostMapping("/add")public String addItemV2(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) { //검증 처리 if(!StringUtils.hasText(item.getItemName())) { bindingResult.addError(new FieldError("item", "itemName", item.getItemName(), false, null, null,"상품 이름은 필수 입니다.")); } log.info("item.getPrice()={}", item.getPrice()); if(item.getPrice() ==null || item.getPrice() < 1000 || item.getPrice() > 1000000) { bindingResult.addError(new FieldError("item", "price", item.getPrice(), false, null, null,"가격은 1,000원 ~ 1,000,000원 까지 허용합니다.")); }
-
해결됨스프링 핵심 원리 - 고급편
target 인스턴스도 빈으로 등록은 되는 건가요?
강의를 재밌게 보고 있는데, 의문이 있어서 질문드립니다. "대안1 자기 자신 주입" 강의 0:47 때 그림을 보여주시는데, 해당 그림에서는 target 인스턴스 내에서 proxy 를 의존성 주입 받아서 사용하는 걸로 표현됩니다. 여기서 의문이 들었습니다. 제 지식으로는 "스프링 빈으로 proxy 가 등록되고, target 은 빈으로 등록되지 않고, proxy 가 내부에서 참조만 한다"라고 알고 있습니다.(틀리다면 꼭 지적해주십쇼!) 그리고 또 한가지는 제가 알기로는 "의존성 주입을 위해서는 쓰는 쪽과, 받는 쪽 모두 빈으로 등록되어 있어야 한다."라는 것입니다. 이 두 가지 생각을 합치니 0:47 에 나오는 그림이 이상해 보였습니다. 그림 상에서는 빈으로 등록되지 않은 target 인스턴스가 의존성 주입을 받고 있는 걸로 보이거든요... 그림 처럼 되려면 target 인스턴스도 빈으로 등록이 되어야 하는데... 혹시 target 인스턴스도 빈으로 등록이 된건가요??
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
th:errors
<div> <label for="itemName" th:text="#{label.item.itemName}">상품명</label> <input type="text" id="itemName" th:field="*{itemName}" th:errorclass="field-error" class="form-control" placeholder="이름을 입력하세요"> <div class="field-error" th:errors="*{itemName}"> 상품명 오류 </div></div> 여기에서 궁금한게 th:field="*{itemName}"이거는 모델에 담긴 item의 itemName이고 th:errors="*{itemName}" 이거는 바인딩리절트에 담긴 에러 item의 itemName이라고 보면 되나요? 그리고 필드네임이 맞춰져있어서 쓸 수 있다는 강사님의 말이 th:field와 th:errors의 변수이름이 같다는 걸 의미하는건가요?
-
미해결스프링 핵심 원리 - 고급편
Advisor의 빈 저장소 등록 시점이 빈 처러기의 대상이 될 객체의 빈 저장소 등록 시점 보다 어떻게 더 빠를 수 있나요?
1. 생성: 스프링이 스프링 빈 대상이 되는 객체를 생성한다. ( @Bean , 컴포넌트 스캔 모두 포함)2. 전달: 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달한다.3. 모든 Advisor 빈 조회: 자동 프록시 생성기 - 빈 후처리기는 스프링 컨테이너에서 모든 Advisor 를 조회한다.4. 프록시 적용 대상 체크: 앞서 조회한 Advisor 에 포함되어 있는 포인트컷을 사용해서 해당 객체가 프록시를 적용할 대상인지 아닌지 판단한다. 이때 객체의 클래스 정보는 물론이고, 해당 객체의 모든 메서드를 포인트컷에 하나하나 모두 매칭해본다. 그래서 조건이 하나라도 만족하면 프록시 적용 대상이 된다. 예를 들어서 10개의 메서드 중에 하나만 포인트컷 조건에 만족해도 프록시 적용 대상이 된다. 제가 이해한 바로는 3.에서 스프링 컨테이너에 Advisor들은 이미 스프링 컨테이너에 등록 되어있는 것을 찾아오고 빈 후처리기에서 Advisor를 적용하여 프록시 객체를 생성할 target객체들은 생성만 되어있고 스프링 컨테이너에는 등록이 안되어 있는 것으로 이해했습니다. 이렇게 되려면 스프링이 Advisor를 구분해서 먼저 스프링 컨테이너에 등록 할 수 있어야 할 것 같은데 제가 제대로 생각하고 있는 것이 맞을까요?