묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
빈연결 에러!
SpringConfig에서 문제가 있는데 이유가 뭔지 모르겠습니다! Could not autowire. There is more than one bean of 'MemberRepository' type.Beans:memoryMemberRepository (MemoryMemberRepository.java)springDataJpaMemberRepository (SpringDataJpaMemberRepository.java)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Update 할 때 조건검사(price >= 0) 는 어디서 하는게 좋은 방법일까요?
안녕하세요. 너무 좋은 강의 잘 듣고있습니다 !! :) 강의 마지막부분에서 가장 좋은 방법이라고 말씀해주신대로, Service 계층에 ItemUpdateDto 를 추가하고, 엔티티 클래스에 update() 함수도 만들어서 구현을 했습니다. 여기서 한 가지 궁금한점이 생겼는데요, - price >= 0 - stockQuantity >= 0 - name 은 빈 문자열이 아님(StringUtils.hasText == true) 등의 조건을 검사하여 exeception 을 날리거나, update 를 진행하고 싶을 때 조건검사를 어디서 하는 것이 가장 좋은지 고민이 됩니다. 제 생각에는 크게 세가지 방법이 있을 것 같은데요.. 1. Controller 에서 검사하여, 검증된 값만 DTO에 담아서 service 에 전달한다. 2. service 에서 엔티티의 update() 함수를 호출하기전에 검사한다. 3. 엔티티 클래스의 update() 함수 내부에서 검사한다. 세 가지 방법에대해 제가 고민해본 내용을 말씀드리면.. Book 클래스의 removeStock() 처럼 엔티티 내부에서 검사하고, NotEnoughStockException 같은 에러를 날리는 비지니스 로직을 넣어야할까요? (코드에 일관성이 있도록..) --> 3번 그런데, Controller 에서 미리 검사를 하면 굳이 service -> repository 를 타고 내려가서 select 쿼리를 날릴 필요가 없어지기 때문에 성능상 유리할 것 같다는 생각도 듭니다. --> 1번 두 군데에서 다 검사를 하는 것이 좋을까요? 실무에서는 보통 어떤 방법을 채택하는지 궁금합니다 .
-
미해결스프링 핵심 원리 - 기본편
생성자를 만드는 이유가 먼가요?
public class Order { private Long memberId; private String itemName; private int itemPrice; private int discountPrice; public Order(Long memberId, String itemName, int itemPrice, int discountPrice) { this.memberId = memberId; this.itemName = itemName; this.itemPrice = itemPrice; this.discountPrice = discountPrice;} 위에 private Long memberId; 이렇게 정의 하는데 굳이 생성자를 만들 필요가 왜 있는 건가요??
-
미해결스프링 핵심 원리 - 기본편
필터 강의 부분 질문
안녕하십니까 선생님 필터 부분 강의를 들으면서 궁금한 점이 생겨 질문드립니다. BeanA와 BeanB는 따로 @Component가 붙어있지 않습니다. 그래서 저는 혹시 만드신 MyExcludeComponent와 MyIncludeComponent에 붙어 있는 어노테이션 중에 @Component가 있을까해서 찾아보았는데 없었습니다. ComponentScan에서 사용하는 includeFilters에도 있나 했는데 없었습니다. 그렇다면 클래스에 따로 Component가 붙어있지 않을 때도(물론 붙어있으면 빈으로 등록되는 것은 알고 있습니다!), includeFilter를 사용하게 되면 스프링 빈으로 등록이 되는건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
RequestMapping 추가 질문
안녕하세요 김영한 팀장님. 강의 너무 잘 듣고 있습니다. 앞 강의(Handler / Adapter)를 듣고 이번 강의를 듣다가 궁금한 점이 생겨서 문의드립니다. 앞 강의 첫 번째 예시에서 OlderController -> Controller 인터페이스를 구현하였고, SimpleControllerHandlerAdapter가 채택되어, 내부에서 OlderController가 오버라이딩한 메서드 'handleRequest'를 실행함 앞 강의 두 번째 예시에서 MyHttpRequestHandler -> HttpRequestHandler 인터페이스를 구현하였고, HttpRequestHandlerAdapter가 채택되어, 내부에서 MyHttpRequestHandler가 오버라이딩 한 메서드 'handleRequest'를 실행함 이번 강의의 @RequestMapping된 Controller들은 인터페이스를 구현하고 있지 않는데 어떻게 'RequestMappingHandlerAdapter' 라는 핸들러 어댑터에서 (입력되는 파라미터들도 각기 다른) process 메서드를 호출할 수 있는건지 궁금합니다. 이것도 @RequestMapping 애노테이션으로 인한 효과로 이해하면 될까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
JSP 파일이 Java 코드로 변환된 파일 경로에 대한 질문입니다.
안녕하세요, JSP를 사용한 회원 관리 프로젝트를 진행하던 중 궁금한 것이 생겨 질문드립니다. JSP도 결국에는 프로젝트 실행시 Java 코드로 변환이 되는 것으로 알고 있는데요. 이전에 개인적으로 Eclipse IDE를 사용한 경우 .metadata라는 폴더가 존재했고, 그 안을 들여다 보면 JSP가 Java 코드로 변환된 파일이 존재했습니다. 예를 들어 "sum.jsp" 파일을 작성했다면 "sum_jsp.java" 파일이 존재한 것 처럼요. (이 .java 파일안에서 pageContext, session, application 객체를 사용할 수 있도록 선언되어 있었던 것도 기억이 나네요.) 어느덧 IntelliJ에 익숙해져서 이런 내용을 잊어버린체 코딩을 하는 것 같아 제가 작성한 JSP 파일에 대해 Java 코드로 변환된 파일을 찾아보고 싶은데, 어떤 경로를 통해 찾을 수 있을까요? 미리 답변 감사드립니다.
-
미해결스프링 핵심 원리 - 기본편
@Configuration과 @ComponentScan 같이 사용
안녕하세요. 강의 너무 잘 보고 있습니다. 감사합니다.@Configuration과 @ComponentScan과 관련해서 질문이 있습니다. 1. AutoAppConfig class에 @ComponentScan이 정의돼 있으면, 추가적으로 Bean정의를 해주는 게 아니라면@Configuration은 필요 없지 않나요? 2. AppConfig에 @Configuration 어노테이션이 살아있으면 CoreApplication을 시작할 때, 이번에 새로 작성한 AutoAppConfig에서 빈을 등록하고 AppConfig에서 다시 한 번 Bean을 등록하면 Bean을 중복 등록하지 않나요? 3. @Configuration의 기능이 @Configuration이 사용된 클래스에 정의된 Bean 전부를 Spring Container에 등록하는 걸로 이해했습니다. @Configuration만 사용하면 프로젝트 전 범위의 파일을 스캔하지만 여기서 @ComponentScan의 Fiter 기능을 추가하면 탐색 범위를 축소시킬 수 있는 건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
테스크 코드 작성할 때 given/when/then의 정확한 의미가 궁금합니다.
기존에는 테스트코드에 대한 중요성을 몰라서 그냥 따라 치기만 했었는데요 생각이 바뀌어서 강의를 들으면서 테스트 코드에 대한 것도 같이 배우면 좋겠다고 생각해서 테스트코드를 이해하고 공부하려고 하는데 혹시 김영한님이 테스트 코드 작성하실 때 쓰는 given/when/then의 정확한 의미가 어떻게 되나요 ?.. 소스를 봐도 딱 개념을 정립하기에 어려움을 겪어 질문하게 되었습니다 ㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
@Component 사용이 OCP를 위배하지는 않는가요?
앞서 강의에서 AppConfig파일을 만들고 의존성을 주입했던 이유는 - 기존의 자바 코드가 DIP를 위반 했고, - 또한 OCP 역시 만족하지 못했기 때문이었습니다. 따라서 AppConfig파일은 기존의 코드를 전혀 건들지 않고도 새로운 구현체를 역활에 맞게 끼워넣을 수 있었습니다. 하지만 @ComponentScan과 @Component를 통해 자동으로 스프링빈을 등록하는 방식은 역활에 따른 구현을 갈아 끼울 때 또다시 코드를 '수정'해야합니다. 저의 생각으로는 이는 앞서 말했던 OCP를 위반하는 방식 같은데, 이러한 방식은 OCP를 위반해서라도 더 편하게 Bean을 관리하기 위함입니까? 아니면 뒷쪽 강의에서 이에대한 이야기가 추가적으로 언급이 되나요?
-
미해결스프링 핵심 원리 - 기본편
Qualifier 빈 생성 질문합니다.
/**1. Qualifier 의 속성을 복사한다. */@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documented@Qualifier("mainDiscountPolicy")public @interface MainDiscountPolicy {} 안녕하세요 선생님 수업질문이 있습니다! @Qualifier 타입체크 문제를 해결하기 위해 위 코드처럼 빈을 따로 생성하면서 Qualifier 위에 @Target @Retention,, 등등의 속성을 가져왔는데 그럴필요 없이 @Qualifier만 명시해도 그 안에 속성을 자동으로 데려오는게 아닌지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
thymeleaf, cannot resolve vars 에러 문제
이런식으로 에러가 떠서 구글링을 해보니 다양한 해결책이 있긴한데 그것이 옳은 방식으로 해결되는 것인지 모르겠습니다 <html xmlns:th="http://www.thymeleaf.org"> 여기에서 www를 삭제하면 th: 라인이 전부 초록색으로 변하면서 에러는 해결되기는 하더라고요 다른 해결 방식이 있을까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
spring 공부 자료에 관해서
안녕하세요 강의는 매우 잘 듣고 있습니다. 강사님이 설명해주신 부분에 대해서 개인적으로 더 공부하고 싶은데 혹시 스프링은 참고할만한 사이트가 있을까요? 예를들어 postmapping 같은 경우 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/PostMapping.html 구글링하면 이런 사이트가 나오는데 이런 형식 말고 혹시 사용법이나 설명, 예제가 자세한 문서가 있을까요??
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
데이터베이스 연동관련 문의
안녕하세요, 강의 잘 듣고 있는 학생입니다. 다름이 아니라 "스프링 통합 테스트"부분에서 기존 메모리에서 진행하던 테스트를 DB랑 연동해서 진행하는 부분에서, 테스트로 진행한 name이 들어가지 않는 중입니다. 테스트 돌릴시 fail은 따로 뜨지 않고, 잘 넘어가는 중입니다. 그리고 id 시퀀스도 하나 증가해서 잘 되는데 name이 등록이 되지 않더라고요. 따로 프로젝트를 실행해서 웹페이지에서 넣으면 문제없이 동작하는 중입니다. (따로 id 시퀀스가 증가가 잘되는 것을 확인한게 웹페이지에서 넣고, 테스트로 돌리고, 다시 웹페이지에서 넣었을시, id가 8,10이 뜨는걸로 확인했습니다.) 어떻게 수정하면 될까요..ㅎ?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션의 동작원리와 코드에 대해서 질문드립니다
직접 세션을 만든경우 이런메커니즘으로 이해했습니다. 예를들어 유저a가 처음로그인할경우에 1.세션id 생성 (1234 라고가정) 2.세션store(Map)에 저장(1234,유저a) 3.쿠키생성("mySessionId", 1234) 4.쿠키를 response에 저장후 응답 다시 요청을하면 5. 서버는 클라이언트가 넘겨준 여러개의 쿠키중("mySessionId", 1234) 쿠키를 찾고 6. 서버는 이 쿠키를 가지고 세션store에서 유저a정보를 찾아낸다. 이때 세션이라는게 세션store에 저장된 (key,value)한 쌍을 세션이라고 보는건가요?? 아니면 세션store(Map)자체를 세션이라고 보는건가요? 그리고 HttpSession 이라는 기능을 사용했을때 1. HttpSession session = request.getSession(); 2.session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember); 이 두줄의 코드가 위의 1,2,3,4의 역할을 한다고 보면 되는건가요? 그렇다면 request.getSession()이 세션을 생성하거나 반환하는것과 더불어 세션id를 생성하고 쿠키도 생성하는 역할을 하는건가요? 사실 이것뿐만 아니라 HttpSession기능을 사용하였을때 원리가 머릿속에 그려지지가 않습니다 ㅠㅠ 질문이 많아서 죄송합니다.. 계속 돌려봐도 이해가 잘 되지 않아 질문드립니다
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
#ids.seq 질문입니다.
공식 문서를 보니 ids에 prev 말고도 seq, next가 있어서 직접 해보았는데 seq를 사용하니 regions2, regions4, regions6으로 나오더라구요. next를 사용하면 regions2, regions3, regions4 순으로 나오구요. 실습대로 prev를 사용하면 regions1, regions2, regions3 순으로 나옵니다. 카운팅이 어떻게 되는지 모르겠습니다. prev면 이전 카운트를 가져오는 것 같아 시작 카운트가 2인가? 생각했는데 next를 보면 아닌 것 같고 seq는 순서대로 증가할 것 같은데 2 단위로 증가하는 걸 보니 헷갈립니다. 공식 문서에도 별다른 설명이 없어 질문드립니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서블릿에서 http 메서드 질문드립니다.
Get/Post/Put/Patch 등등 메서드가 여러개 있는데 쿼리파라미터 이용하면 무조건 Get, html form 이용하면 무조건 Post 이런 식으로 메서드가 정해져있는건가요 ? 그리고 서블릿 자체에서는 이것들이 어떻게 들어오는지 인식하고 각각 처리 하는건가요 ? 자바 소스로 따로 put인경우 , get인 경우 등 나눠주지 않았는데 어떻게 인식하는지가 궁금합니ㅏㄷ.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
선생님 배포관련 궁금한게 있습니다.
배포할때 저는 로컬에서 개발하고 테스트한 후에 리눅스 서버에 환경셋팅하고 개발된 프로젝트를 war로 올려서 톰캣을 실행시키는 방식으로 배포했었는데요. 1. 스프링부트 그래들 jar패키지로 로컬에서 개발을 완료하면 리눅스 서버에 배포할때는 그냥 jar만 옮겨서 실행시키면 되나요? 2. 톰캣을 내렷다 올리는 작업같은 경우는 어떤식으로 하는건가요? 질문이 아직 모르는게 너무 많네요 열심히하겠습니다ㅠㅠ
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
강의 내용중 이미지 파일 출력 핸들러 메소드의 보안적 문제 언급에 대한 질문입니다.
안녕하세요. 이번 강의 내용에서 이미지 출력 처리에 있어서는 여러 방법 중 UrlResource를 사용하여 처리하는 과정을 볼 수 있었습니다. @ResponseBody@GetMapping("/images/{filename}")public Resource downloadImage(@PathVariable String filename) throws MalformedURLException { return new UrlResource("file:" + fileStore.getFullPath(filename));} 다만, 32:25 부분에서 "위 코드 만으로는 보안에 취약해 보일 수 있으니, 여러 체크 기능을 넣는 것이 좋다"라고 언급하신 부분에 대해 어떤 부분이 보안에 취약할까 생각하던 중 도무지 생각나질 않아서 좀 더 구체적인 내용을 얻어갈 수 있을까 해서 질문드립니다. 보안 이슈에 대한 설명만 해주셔도, 취약점 체크를 위한 코딩에 도움이 될 것 같습니다. 미리 답변 감사드립니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
repository은 트랜젝션이 기본인가요?
예전에는 service단에서 trasaction을 걸어서 했었는데 repository에 기본적으로 @trasantional이 적용되어있나요?? 그렇기 때문에 db에서 쿼리를 해올수잇는건지 궁금합니다 ㅎㅎ 추가적으로 repository에 transation이 걸려있다면 왜 service 클래스에 이중으로 @trasational 어노테이션을 거는건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
th:field
안녕하세요 등록지역 코드에 대해 질문하나 하겠습니다. <div> <div>등록 지역</div> <div th:each="region : ${regions}" class="form-check form-check-inline"> <input type="checkbox" th:field="${item.regions}" th:value="${region.key}" class="form-check-input"> <label th:for="${#ids.prev('regions')}" th:text="${region.value}" class="form-check-label">서울</label> </div> </div> ============================================= 이 코드에서 th:field="${item.regions}" 이 속성은 id,name,value 를 세팅을 해주는데 이 등록 지역 코드는 value를 별도로 또 지정해주셨더라구요 이 의미는 id,name 은 th:field="${item.regions}" 이걸로 세팅을 하고 value는 컨트롤러에서 담은 @ModelAttribute("regions") 값으로 쓰겠다는의미이구 이는 value 직접 지정해주면 우선순위가 더 높아서 세팅이 되는거구요.. 제가 이해한게맞나요 ? .......................... 끝으로 자동으로 checked 해주는 기능 대박이네요.. 좋은 설명 항상 감사합니다