묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
getid()를 찾을수 없다 나옵니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]같은 질문글의 import hello.core.member.Member; 부분은 추가해도 안먹힙니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
AOP
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]여기에 질문 내용을 남겨주세요.스프링부트 3.0, JDK17 사용중입니다. AOP 코드를 넣지않고, 스프링 빈 클래스가 잘 찍히는지 확인해보다가. 강의 설명과 다르게, AOP 설정을 넣지 않았는데도 프록시객체가 찍힙니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
핸들러와 어댑터
안녕하세요 클라이언트 요청시 핸들러와 어댑터가 호출되는 흐름이 제가 이해한게 맞는지 질문드리고 싶어요springmvc(강의)에서는 RequestMappingHandlerMapping 클래스를 이용해서 어댑터를 찾았는데요@Controller public class MyController { @RequestMapping("/hello") public ModelAndView hello() { return new ModelAndView("hello"); }위 코드대로 질문을 드려보면요로컬에서 localhost:8080/hello 요청하면dispatcher servlet이 우선 RequestMappingHandlerMapping 빈을 이용해서 MyController을 얻게 되고,그리고 RequestMappingHandlerAdapter 빈을 이용해서 어댑터를 얻어서 어댑터가 MyController의 hello 메소드를 실행한다.이게 맞나요? 근데 어댑터는 구현한적이 없는데 어떻게 실행한다는것인지 ..ㅎㅎ
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Rest api 응답 화면
우선 화면에서는 html ,자바스크립트 ,제이쿼리 ,타임리프만을 사용해보려고 하고있습니다(화면에서 ajax 사용했습니다)아래 2가지 상황에서 화면으로 어떻게 값을 가져와서 사용해야하는지 잘모르겠습니다... ㅠㅠㅠ컨트롤러에서 @ResponseBody가 붙은 메소드에서 데이터를 Map으로 리턴하고 있습니다 그랬을때 화면에서는 어떻게 받아서 사용해야할지 모르겠습니다..컨트롤러에서 @ResponseBody가 붙지 않는 메소드에서는 모델에 담은 데이터가 Map이고 그 Map안에서 특정한 하나의 키에 Value가 배열이고 그 안에 또 Map이 있는 경우에는 어떻게 가져와야할까요?? 배열이 있는부분은 반복문을 써서 전부 화면에서 보여주고 싶습니다
-
해결됨스프링 핵심 원리 - 고급편
내부 호출에서 자기 자신 주입해도 여전히 오류가 뜹니다
프록시와 내부 호출 - 대안1 자기 자신 주입 파트 진행중입니다. 코드를 그대로 따라 쳤는데도 순환참조 오류가 계속 발생합니다. 뭔가 빠진걸까요..
-
해결됨스프링 핵심 원리 - 기본편
CoreApplication 생성이 안됐어요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)build.gradle까지 했는데 CoreApplication 없어서 강의보고 CoreApplication 생성해보니 에러 뜨더라구요https://drive.google.com/file/d/1VEjp2fk8EanR4O3tORA_nKa4wWMlasFv/view?usp=sharing
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
JSP라는게 정확히 어떤 것일까요?
제가 이해한 바로는 Java코드 내에 직접 html을 써서 view를 제공해줬는데 이게 아무래도 하나하나 치는게 불편하다보니 JSP가 등장했고 이를 통해 java에서 html을 쓰는게 아니라 html코드 내에 중요한 부분에만(for를 이용한 동적 활용이나 repository 데이터 조회 등 ?) java코드를 씀으로써 좀 더 코드를 간결하게 만들수 있다는 것 같은데 맞나요 ?? jsp와 타임리프는 둘다 뷰를 그리는 도구이다... ???
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@PostMapping으로 등록 시 파라미터 안에 List 질문입니다.
안녕하세요강의 완강 후 따로 프로젝트를 만들어 보던 중 궁금한 게 생겨서 질문 드립니다. PostMapping으로 등록할 때 CreateRequest라는 별도의 클래스를 만들어 주어서 파라미터로 받았는데 이 CreateRequest안에 List를 받아야 할 경우가 있다면 어떻게 해줘야 하는지 잘 모르겠습니다. Product 클래스 입니다.Module 클래스 입니다.하나의 Product에 여러 개의 Module이 들어갈 수 있기 때문에ProductModule 클래스를 만들어줬습니다.이러한 경우에서Product를 등록할 때아래와 같이 넘겨주고 싶으면CreateProductRequest 에서 List를 어떤식으로 받아줘야 하나요? 아래와 같이 해봤는데 잘 안되는 것 같아서요...
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
entity로 의존관계가 들어와야하는데 반대로 의존관계가 나가버린다
회원조회api 영상의 5:40초쯤 하신 말씀입니다.근데 이 말이 무슨말인지 잘 모르겠어요왜 의존관계가 나간다고 표현하시는 거죠?json으로 출력할때만 출력하지 않는것이 왜 의존관계가 나가는일인건가요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
CQS
관련 질문에 대한 답변을 읽어봤는데도 이해가 가지 않아서 질문드립니다.커맨드와 쿼리를 분리해야한다는 CQS를 설명하신 말이었어요. 내부변경이 일어나는것은 커맨드, 명령어라고 부른다커맨드는 결과값을 그대로 반환하면안된다내부변경이 일어나지않는 것은 쿼리라고 부른다.쿼리는 결과값을 반환한다-> 1. 커맨드에서 결과값을 반환하면 안되는 이유가 뭘까요?update 메서드 안에서도 결국은 update하는것(커맨드)과 findOne(쿼리)하는 코드가 모두 들어가있는거잖아요? 근데 이게 왜 cqs를 지킨 사례인거죠?@Transactinalpublic vodi update(Long id, String name){ memberService.update(id,name); Member member = memberService.findOne(id); rreturn ~~~;}
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
memberUpdateDto가 필요한 이유
강의도중에 설명해주시긴 했는데 그래도 이해가 덜 가서 질문드립니다membersaveDto만있으면 memberupdatedto를 만들지 않아도돼요둘다 만들게 되면 코드의 중복이 발생하는것아닌가요?save와 update는 아예다른것이기때문에 중복이 발생해도 상관이 없는걸까요?아예다른것이라기엔 update에도 있고 save에도 있는 필드에 변화가 생겼을때 둘다 수정을 해주어야해요그럼 수정해야할 포인트가 늘어나는건데도 updateDto를 생성해주는게 맞는걸까요?
-
해결됨스프링 핵심 원리 - 기본편
16:50에서 객체의 생성과 초기화를 분리하자 고 하셨는데
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]우선 객체의 생성과 초기화를 분리하자는 글엔 완전 공감합니다. 근데 동시에 궁금한 점도 몇개 생겼습니다외부에서 접근가능한 setter를 계속 열어주어야 하는데 괜찮나요?생성하고자 하는 객체의 인스턴스 변수에 final 못 붙이지 않나요?@Component일 경우 final 못쓰니 @RequiredArgsConstructor 적용 못하는 문제도 있을 거 같아요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
실제 개발 시 테스트 서버/DB 구성 방식 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의에서는 개발과 테스트 코드가 모두 동일한 h2 DB 기반으로 구현이 되는데 실무에서는 테스트 코드에 대한 DB 연결을 어떤식으로 하게되는지 궁금합니다. 예를 들어 실제 개발은 A 서버의 mysql 을 사용하고 테스트는 로컬의 h2 로 별도로 연결을 하는지,아니면 동일한 서버(환경)에서 테스트용 테이블들만 별도로 만들어서 하는지,또는 모든 환경을 동일하게 하고 테스트 코드만 인메모리에서 실행되게 하는지, 실제 개발 시에는 테스트 코드에 대한 서버, DB 구성 방법이 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
loginservice부분 질문이요
[질문 내용]여기에 질문 내용을 남겨주세요.public Member login(String loginId, String password) { return memberRepository.findByLoginId(loginId) .filter(member -> member.getPassword().equals(password)) .orElse(null); } 여기서 filter앞에 stream를 안 써준 이유가 뭔가요?? java8메소드를 사용하기 위해서는 stream을 앞에 선언해줘야 한다고 알고 있었는데요
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
예외처리와 관련하여 질문이 있습니다.
예외처리를 할 때 catch에서 예외를 잡아줄 때 그 안에 들어가는 예외종류는 상황에 맞게 개발자가 직접 넣어줘야 하는걸까요? 그러면 미리 어떤 예외 터질 거 같다는걸 예측해서 그 예외에 해당하는 걸 찾아서 넣어줘야 하는건가요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타임리프 식 기본 객체 표현식 오류 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 타임리프 - 기본기능 강의중 식 기본 객체 예제 실습 중 표현식 오류가 나서 질문 드립니다.오류내용은 다음과 같습니다.org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "#request" (template: "basic/basic-objects" - line 11, col 7) at org.thymeleaf.spring6.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:292) ~[thymeleaf-spring6-3.1.0.RELEASE.jar:3.1.0.RELEASE] ...중략 Caused by: java.lang.IllegalArgumentException: The 'request','session','servletContext' and 'response' expression utility objects are no longer available by default for template expressions and their use is not recommended. In cases where they are really needed, they should be manually added as context variables. at org.thymeleaf.standard.expression.StandardExpressionObjectFactory.buildObject(StandardExpressionObjectFactory.java:207) ~[thymeleaf-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.thymeleaf.spring6.expression.SpringStandardExpressionObjectFactory.buildObject(SpringStandardExpressionObjectFactory.java:110) ~[thymeleaf-spring6-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.thymeleaf.DialectSetConfiguration$AggregateExpressionObjectFactory.buildObject(DialectSetConfiguration.java:777) ~[thymeleaf-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.thymeleaf.expression.ExpressionObjects.getObject(ExpressionObjects.java:108) ~[thymeleaf-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.thymeleaf.spring6.expression.ThymeleafEvaluationContext.lookupVariable(ThymeleafEvaluationContext.java:134) ~[thymeleaf-spring6-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.springframework.expression.spel.ExpressionState.lookupVariable(ExpressionState.java:146) ~[spring-expression-6.0.2.jar:6.0.2] at org.springframework.expression.spel.ast.VariableReference.getValueInternal(VariableReference.java:76) ~[spring-expression-6.0.2.jar:6.0.2] at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:112) ~[spring-expression-6.0.2.jar:6.0.2] at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:338) ~[spring-expression-6.0.2.jar:6.0.2] at org.thymeleaf.spring6.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:265) ~[thymeleaf-spring6-3.1.0.RELEASE.jar:3.1.0.RELEASE] ... 58 common frames omitted 2022-12-08T22:59:02.658+09:00 ERROR 8488 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "#request" (template: "basic/basic-objects" - line 11, col 7)] with root cause java.lang.IllegalArgumentException: The 'request','session','servletContext' and 'response' expression utility objects are no longer available by default for template expressions and their use is not recommended. In cases where they are really needed, they should be manually added as context variables. at org.thymeleaf.standard.expression.StandardExpressionObjectFactory.buildObject(StandardExpressionObjectFactory.java:207) ~[thymeleaf-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.thymeleaf.spring6.expression.SpringStandardExpressionObjectFactory.buildObject(SpringStandardExpressionObjectFactory.java:110) ~[thymeleaf-spring6-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.thymeleaf.DialectSetConfiguration$AggregateExpressionObjectFactory.buildObject(DialectSetConfiguration.java:777) ~[thymeleaf-3.1.0.RELEASE.jar:3.1.0.RELEASE] ...중략해당 내용을 해석해보니 더이상 #request와 같은 표현식은 제공이 안되고 수동적으로 변수를 주입해서 사용하라는 것 같습니다. (modelAttribute로 request를 넘겨줘보니 출력이 잘되는걸 확인했습니다.) 혹시라도 제가 실수를 해서 표현식이 안되는 것인지 아니면 진짜로 더이상 이런 표현식을 제공하지 않는 것인지 궁금합니다.항상 좋은 강의 감사합니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
유효성 검증 위치 관련 질문
안녕하세요. 로드맵 수강하고 토이 프로젝트 진행 중인데 궁금한 점이 계속 나오네요..일반적으로 사용하는 표현 - 비즈니스 - 도메인 계층 구조에서 비즈니스 정책을 검증하는 위치와 관련해서 질문 드립니다.예를 들어 사용자용 게시글 삭제 API는 현재 요청 사용자가 게시글의 작성자가 맞는지 검사합니다. 이 검증 작업을 서비스 계층에서 처리했습니다.public class PostService { private final PostRepository postRepository; // 게시글 삭제 기능 public void deletePost(Long postId, Long currentMemberId) { // 엔티티 조회 후 게시글 작성자가 현재 요청 사용자( currentMemberId )와 일치하는지 검사 Post post = postRepository.findById(postId); if (!post.getWriter().getId().equals(currentMemberId)) { // 작성자가 아니면 예외 발생 } post.delete(); } }이 메서드를 사용자 API 컨트롤러에서는 잘 사용했는데, 관리자 API는 게시글 작성자 검증이 필요 없다는게 문제였습니다. 사용자 및 관리자용 API 컨트롤러에서 호출하는 것은 결국 '게시글 삭제'라는 동일한 기능이므로 하나의 서비스 클래스에서 제공하는 게 맞다 판단하여 deletePost() 메서드에서 수행하던 유효성 검증 로직을 사용자 API 컨트롤러로 이관했습니다.public class PostController { private final PostService postService; // 실제 코드는 아니며 설명용 코드입니다. // 예를 들어 currentMemberId의 경우 실제론 @AuthenticationPrincipal 등을 통해 얻습니다. @DeleteMapping("/{postId}") public void delete(Long currentMemberId, @PathVariable Long postId) { Post post = postService.findPost(postId); if (!post.getWriter().getId().equals(currentMemberId)) { // 작성자가 아니면 예외 발생 } postService.deletePost(postId); } }이렇게 구성하니 PostService를 사용자 API 컨트롤러에서도, 관리자 API 컨트롤러에서도 사용 가능했지만.. 표현 계층에서 비즈니스 정책을 검증하니 구조가 이상한 것 같아서 질문 드립니다.'게시글을 삭제하려는 사용자가 게시글의 작성자인가?'를 확인하는 작업은 비즈니스 정책에 의한 작업이라 생각합니다. 그러므로 서비스 계층에서 검사하는 게 맞다 생각되는데, 관리자 API에서 사용하기 불편하더라구요. 이런 경우 구조를 어떻게 가져가시나요?PostService는 비즈니스 로직만 처리하고, PostUserService 같은 래퍼 서비스를 만들어 검증 부분을 처리할까 했는데, 썩.. 맘에 들진 않았습니다.예시처럼 정책 검증을 컨트롤러에서 수행한다 가정하면, 제 코드의 경우 PostService.findPost() 메서드에 @Transactional(readOnly=true)를 적용한 상태라 deletePost() 메서드에서 SELECT 쿼리를 또 실행합니다.@Transactional(readOnly=true)은 정말 필요한 곳에만 선택적으로 적용하시나요? 아니면 읽기 전용 메서드는 별도로 구분하시나요?'서비스는 최대한 비즈니스 로직만 수행하고, 정책 유효성 검증은 다른 위치에서 진행하는 것이 좋다'라는 분들도 있던데, 보통 어떤 식으로 처리하시나요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
request-body-json-v4 질문 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]HttpEntity는 HTTP 메시지를 편하게 조회할 수 있게 해준다고 알고 있습니다.httpEntity.getBody()바디 내용을 조회한 다음 HttpMessageConverter가 HelloData의 객체로 변경해줬다고 생각하는게 제대로 이해한게 맞나여?
-
미해결스프링 핵심 원리 - 기본편
OrderApp 테스트
OrderApp 클래스 만들고 실행하면이렇게 뜨는데 뭐가 잘못된 걸까요?? MemberApp에선 잘 동작했는데 ㅠㅠ 코드 다 지우고 다시 따라쳤는데도 안되네요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
빌드하고 실행하기 gradlew build 에러 ㅠㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. intelllij환경설정 전부 이상없이 설정하였고, 자바 11사용중인데 cmd 창에서 빌드하려니 계속 아래와 같은 에러가 뜹니다 ㅠㅠ 어떻게 해결할 수 있을까요?? Task :test FAILEDError: Could not find or load main class worker.org.gradle.process.internal.worker.GradleWorkerMainCaused by: java.lang.ClassNotFoundException: worker.org.gradle.process.internal.worker.GradleWorkerMainFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':test'.> Process 'Gradle Test Executor 3' finished with non-zero exit value 1* Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.* Get more help at https://help.gradle.orgBUILD FAILED in 3s7 actionable tasks: 1 executed, 6 up-to-date