묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
검증 오류 시 api 전송
MemberApiController의 saveMemberV2()에서 @Valid에 의해 검증 오류가 발생한 경우에도 오류에 대한 api를 내려줘야 하잖아요. 이때에도 오류가 없는 경우와 마찬가지로 CreateMemberResponse를 반환해야 하는 건가요?검증 오류가 발생했을 때 api를 어떻게 전달해야하는지를 잘 모르겠습니다.
-
해결됨PZM기반 실무중심 백엔드 부트캠프(프리트레이닝)
rest api json 객체 한글 깨짐 현상
안녕하세요~ 선생님 강의 정말 재미있게 듣고 있습니다. 49강 강의를 듣는 중에 restful api json 객체 한글 깨짐 현상이 있습니다. 혹시 chrome 문제였나 싶어 postman 으로도 띄워봤지만 여전합니다.ㅠㅠㅠ 구글 찾아가며 해결해보려고 했지만 잘 해결되지 않습니다. // http://localhost:8081/myweb/rest @RequestMapping("/rest" ) public List<String> rest(HttpServletResponse response){ response.setCharacterEncoding("UTF-8"); List<String> list=new ArrayList<>(); list.add("스프링 프레임워크"); list.add("잘 하면"); list.add("된다"); System.out.println("Returning list: " + list); return list; // rest.jsp <-- 뷰를 만들면 된다.(X) : JSON -> [{ key:value, , ,}.{ },{ }] }System.out.println("Returning list: " + list);이 부분 콘솔에 찍힌 값도 Returning list: [�뒪�봽留� �봽�젅�엫�썙�겕, �옒 �븯硫�, �맂�떎]이렇게 나옵니다. 수정:// http://localhost:8081/myweb/rest @RequestMapping("/rest" ) public List<String> rest(){ List<String> list=new ArrayList<>(); list.add("스프링 프레임워크"); list.add("잘 하면"); list.add("된다"); System.out.println("Returning list: " + list); System.out.println("안녕"); return list; // rest.jsp <-- 뷰를 만들면 된다.(X) : JSON -> [{ key:value, , ,}.{ },{ }] }System.out.println("안녕");이 부분도 깨져서 나와용. ㅠㅠㅠㅠㅠ감사합니다~package com.example.controller;import com.example.entity.Book;import com.example.repository.BookMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.*;import java.util.ArrayList;import java.util.List;@RestControllerpublic class SpringRestController { // http://localhost:8081/myweb/rest@RequestMapping("/rest")public List<String> rest(){List<String> list=new ArrayList<>();list.add("스프링 프레임워크");list.add("잘 하면");list.add("된다");return list; // rest.jsp <-- 뷰를 만들면 된다.(X) : JSON -> [{ key:value, , ,}.{ },{ }]} }
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
api 개발 시 회원가입 폼 요청
타임리프를 사용했을 때는 회원가입 시에 @GetMapping을 사용하고 뷰 템플릿을 반환하도록 했는데요. api로 개발 시에는 회원가입 폼을 요청하는 url을 따로 만들지 않아도 되는 건가요? 이 경우에는 어떻게 처리되나요..?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
PlatformTransactionManager가 주입되는 이유
제가 알기로는 스프링에서 의존성 주입을 위해서는 @Component등의 어노테이션이 달려 있어 빈으로 등록되어야 컴포넌트 스캔에 의해서 자동으로 주입된다고 알고있는데요PlatformTransactionManager는 클래스를 확인해보아도 그러한 어노테이션이 없는데도 자동 주입되는 이유가 뭔가요? gpt에 물어보니 스프링이 제공하는 트랜잭션 관리 기능의 핵심 인터페이스이므로 빈으로 등록하지 않아도 주입된다고 하는데 맞는말인가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션을 가져오는 원리
DataSourceUtils.getConnection()가 트랜잭션 동기화 매니저가 관리하는 커넥션이 있으면 해당 커넥션을 가져오는것은 알겠는데요, 어떻게 알고 가져오나요? 예를들어 13분에 나오는 public class MemberServiceV3_1 { private final PlatformTransactionManager transactionManager; private final MemberRepositoryV3 memberRepository; public void accountTransfer(String fromId, String toId, int money) throws SQLException { //트랜잭션 시작 TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { //비즈니스 로직 bizLogic(fromId, toId, money); transactionManager.commit(status); //성공시 커밋 } catch (Exception e) { transactionManager.rollback(status); //실패시 롤백 throw new IllegalStateException(e); } } private void bizLogic(String fromId, String toId, int money) throws SQLException { Member fromMember = memberRepository.findById(fromId); Member toMember = memberRepository.findById(toId); memberRepository.update(fromId, fromMember.getMoney() - money); validation(toMember); memberRepository.update(toId, toMember.getMoney() + money); } private void validation(Member toMember) { if (toMember.getMemberId().equals("ex")) { throw new IllegalStateException("이체중 예외 발생"); } } }이 코드에서 bizLogic 부분에는 트랜잭션 매니저와 같은 파라미터를 전달해주지 않는데, 아무리 DataSourceUtils.getConnection()를 쓴다 한들 어떤 트랜잭션 매니저가 시작한 커넥션인지 어떻게 아는거죠?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
5:14 rollbackOnly에 대해서
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]강의 5:14분 내용에 대한 질문입니다. ‘rollbackOnly를 참고하지 않는다’는 말은,가장 바깥쪽에 있는 트랜잭션 AOP 프록시 객체(MemberService의 트랜잭션 AOP 프록시 객체)가 런타임 에러를 만나면어차피 트랜잭션 매니저에게 롤백 요청을 하기 때문에 rollbackOnly를 따로 참고하지 않아도 된다는 뜻인가요? 그렇다면, 만약 런타임 예외가 발생하지 않는 경우 rollbackOnly는 내부 트랜잭션 중 하나에서 임의로 롤백했을 때바깥쪽에서 이를 감지하는 용도로 사용되는 건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
코드 볼 수 있나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]혹시 강사님이 영상에서 작성하시는 코드를 모아놓은 곳이 있나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemoryMemberRepository 클래스에는 생성자가 없는데
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]MemoryMemberRepository 클래스에는 생성자가 없는데 어떻게 스프링 컨테이너에 등록이 되는거죠? 그리고 MemberRepository의 구현체가 몇가지 더 있는 경우 MemberService의 생성자 파라미터에는 어떤 구현체가 들어가나요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
WAS 서버 죽음
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]WAS 서버가 잘 죽는다고 하는데 어떤 의미인가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
System.out.println("req = " + req);이 실행되지 않습니
HttpServletResponse 수강중 갑자기 JAVA_HOME 관련 오류가 발생하여(해결못함) 인텔리제이와 자바를 모두 재설치후 HelloServlet부터 다시 작성중입니다. 코드 작성후 localhost8080:/hello에 접속해도 println문이 실행되지 않고 아래와 같은 [nio-8080-exec-1]이라는 문구 3줄이 나타납니다.[nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'[nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'[nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms 문의글 작성중 추가적인 코드가 여러줄 추가되어 일부 올립니다 오후 6:09:56: Executing ':hello.servlet.ServletApplication.main()'...Invalid Java installation found at 'C:\Users\ido0709\.jdks\jbr-17.0.12' (IntelliJ) auto-detected. It will be re-checked in the next build. This might have performance impact if it keeps failing. Run the 'javaToolchains' task for more details.> Task :compileJava> Task :processResources UP-TO-DATE> Task :classes> Task :hello.servlet.ServletApplication.main() Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x010x000xee0x010x000x000xea0x030x030xfdd0x99"}0xce0xe30x960xd8b0xec0x880x160x82J0xa1x0x9a0xde0xa70xb0^0x8au0xfc0xbd;0x7f0xf150xe40xed ]. HTTP method names must be tokens at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:407) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:257) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]
-
미해결Practical Testing: 실용적인 테스트 가이드
MSA 환경에서의 Rest Docs 구성 환경 설정에 대한 문의
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요! 모든 강의 수강하였고, 강의 내용을 기반으로 기존 작업한 프로젝트에 리팩토링을 진행하고 있습니다.진행한 프로젝트는 MSA 기반으로, Swagger 를 사용하여 진행하였습니다.서비스가 나눠져 있어, 각 서버별로 독립적인 문서를 가지고 있고, 개발자가 각 서버에 접근을 해야하는 문제가 있었습니다.따라서 기존에는 Getway Server에 Swagger를 띄우고 각 서버를 discovery 서버에서 받아와서 api 호출을 통해 문서를 받아오게 하여 gateway에서 전체 문서를 열람 가능하게 하였습니다. 위와 같은 환경에서 동일하게, 단일 진입점으로 활용할 서버에 docs 설정을 통해 각 서버의 API 문서를 받아올 수 있게 구성하면 될까요? 아니면, 다른 방법이 있을까요? 현업에서 어떻게 구성하시는지 궁금합니다.
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
RoleHierarchyImpl 관련 deprecated 이슈로 인한 수정 코드 기록
Spring security 6.3.3 버전에서 setHierarchy와 생성자인 RoleHierarchyImpl()가 deprecated 되어 공식문서 권장 방법으로 수정한 코드를 남깁니다.전) 이전 방식@Bean public RoleHierarchy roleHierarchy() { RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl(); roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_DB\n" + "ROLE_DB > ROLE_USER\n" + "ROLE_USER > ROLE_ANONYMOUS"); return roleHierarchy; } 후) 정적 메소드 fromHierarchy 사용@Bean public RoleHierarchy roleHierarchy() { return fromHierarchy("ROLE_ADMIN > ROLE_DB\n" + "ROLE_DB > ROLE_USER\n" + "ROLE_USER > ROLE_ANONYMOUS"); }
-
미해결스프링 핵심 원리 - 기본편
@PostConstruct 사용시 @ComponentScan 으로 구현
1. 강의 내용과 관련된 질문인가요?예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의에서 @Configuration 과 @Bean을 사용하여 초기화, 소멸 라이프사이클을 보았는데 강의에선 구현하진 않았지만 @ComponentScan으로 사용해보고 싶어서 NetworkClient에 @Component를 달고 LifeCycleConfig를 @ComponentScan 을 달아 사용해볼려고하였습니다. 근데 AnnotationConfigApplicationContext 사용하여 빈등록할시 저희가 의도했던 @PostConstruct 시점이 setUrl하기전에 불러와지는거같아 Null 값이 나오는데 ComponentScan사용시 setUrl 위치나 타이밍을 알고싶습니다
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradlew build failed 와 Unable to load class 'org.gradle.api.plugins.MavenPlugin'. 오류 해결 방법
저의 경우에는, Unable to load class 'org.gradle.api.plugins.MavenPlugin'.This is an unexpected error. Please file a bug containing the idea.log file.오류의 이유와 gradlew build failed빌드에 실패하는 이유가 동일했습니다. 해결 방법 아래 주소에 적어두었으니, 참고하세요 !💡 https://blog.naver.com/bkmij/223594375357 도움이 되었으면 좋겠습니다.모두 남은 학습 열심히 화이팅하세요 : ) ! ☺☺ https://www.inflearn.com/community/questions/1333084/build-gradle-%EA%B4%80%EB%A0%A8-%EC%98%A4%EB%A5%98-unable-to-load-class-x27-org-gradle-api-plugins-mavenplugin?srsltid=AfmBOopJ4VA4YBT1JxsR3YjKEGdr1qYs0Y1QQgxTYQcBfdS2WYsBTeqa↑댓글을 참고하여 해결하였습니다.
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
세션 질문입니다.
사용자가 웹에 접속하고 로그인도 안했는데 세션이 왜 생기는건가요? 지금까지 이전 강의에서는 로그인 인증에 성공하면 그때 서버에서 세션을 생성하고 저장한다고 배웠던거 같은데 그냥 접속만 해도 서버에서 클라이언트에 왜 세션을 주는건지 모르겠습니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
스프링 추상화 질문(exTranslator.translate)
안녕하세요 김영한 강사님. 질문 있습니다!질문: JDBC 기술 외에 어떻게 스프링 예외 추상화를 적용시킬 수 있는지. exTranslator.translate를 통해서 스프링 예외로 변환하는 것은 편한 것 같습니다. 그런데 MyBatis나 JPA 같은 기술을 사용할 땐 어떻게 사용해야할 지 감이 안오네요JPA는 제가 잘 모르지만 SQL문을 JDBC 처럼 직접 작성해서 pstmt를 통해 보낼 것 같진 않고, MyBatis는 Mapper.xml를 통해 SQL문을 작성하게 되는데 어떻게 스프링 예외 추상화를 적용 시킬 수 있을지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
값 타입의 필드들에 final
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]값 타입의 클래스에 setter를 제공하지 않아도 변경 불가능하도록 할 수 있지만, 필드들에 final을 붙이는 것 또한 괜찮지 않을까요?대신 기본생성자도 만들 기 위해서 @NoArgsConstructor 옵션을 사용 할 수 있을 것 같습니다.최종 형태입니다@Embeddable @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED, force = true) @RequiredArgsConstructor public class Address { private final String city; private final String street; private final String zipCode; }이런식으로 만들어도 될까요? 또 force 옵션을 쓰게 되면 리플랙션/프록시 기술에 영향을 주어서 쓰면 안되는 형태일지 궁금합니다
-
미해결실전! 스프링 데이터 JPA
단순 조인과 페치 조인에 대한 추가 질문입니다.
안녕하세요.강의 항상 잘 보고 있습니다. 아래 두 질문 보고 이해가 안 되는 부분이 있어 질문 드립니다. https://www.inflearn.com/community/questions/33719/fetch-join-vs-joinhttps://www.inflearn.com/community/questions/1364411/%EB%8B%A8%EC%88%9C-%EC%A1%B0%EC%9D%B8%EA%B3%BC-%ED%8E%98%EC%B9%98-%EC%A1%B0%EC%9D%B8%EC%97%90-%EB%8C%80%ED%95%B4-%EC%A7%88%EB%AC%B8-%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4아래처럼 페치조인 사용하지 않고 member와 team을 select해서 가져올 경우에는 lazy 쿼리가 발생할 수 있다고 이해했습니다.@Query("select m, t from Member m join m.team t") List<Member> findInnerJoin(); team을 select하면 영속성 컨텍스트에도 team의 모든 pk가 저장되면서 lazy 쿼리가 발생하지 못하는 것은 아닌가요? 첫번째 링크 질문의 "이번 예제가 좀 특수한 경우고, 일반적으로 team이 영속성 컨텍스트에 미리 존재하는 경우는 드물기 때문에" 라는 답변에서 어떻게 team이 미리 존재하지 않는 경우가 생길 수 있는지 궁금합니다...
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 수정시 기존값이 그대로 유지되어 나타나요
[질문 내용]saveItem에 @Transactional 어노테이션이 선언되어있고, updateItemForm의 Id 값을 hidden으로 설정 되어있는데상품 수정시 기존 값이 그대로 유지되면서 화면에 보여집니다ㅠㅠ뭐가 잘못된걸까요...? 관련 코드도 댓글로 첨부 하겠습니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
BindingResult관련 문의 사항
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 1. Item에 binding된 결과가 BindingResult에 담기다고 하셨는데 정확히 어떤 의미 인지 모르습니다.2. BindingResult에 오류 정보를 설정할때 objectName과 field명을 기재하는데 BindingResult의 순서가 중요한 이유가 뭔가요?3. th:field="*{itemName}"은 controller의 th:object="${item}"을 이용하여 @ModelAttribute로 설정한("item", Item)에 Item의 속성 값에 접근하는 것 같은데 th:errors="*{itemName}" 은 org.springframework.validation.BindingResult.item에 접근하는 것이 맞나요?혹시 맞다면 th:object="${item}", th:object="${item}"에 다른 이름으로 설정하여도 th:errors="*{itemName}"은 관계없이 동작하게 되나요?