묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
질문입니다.
(관련 코드) static class DiscountService { private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) { this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); } (강의에서 설명) DiscountService는 Map으로 모든 DiscountPolicy(부모 인터페이스)를 주입 받는다. 이때 fixDiscountPolicy(자식 클래스), rateDiscountPolicy(자식 클래스)가 주입된다. (질문) DiscountPolicy는 인터페이스고 이것을 상속 받는 객체가 rateDiscountPolicy랑 fixDiscountPolicy입니다. 위 설명 대로라면 부모를 주입 받았을 때 자식까지 다 주입 받는 건가요? 자식을 주입 받았을 때 부모까지 주입 받는 거 아니었나요? 제가 상속에 대해 잘못 알고 있었던 건가요?
-
미해결스프링 핵심 원리 - 기본편
빈 생명주기에서 @PostConstruct & @Component 애노테이션 같이 사용할때 질문입니다.
@ProConstruct , @PreDestroy 와 @Component 애노테이션을 함께 사용해보았는데 @ProConstruct 가 붙은 메서드는 의존관계가 주입이 다 끝난후 작동하므로 init 메서드안에 setUrl 메서드를 이용하여 url을 주입한후 @Component를 이용하여 빈으로 등록하였습니다. 결과는 이전에 강의에서 하셨던 코드와 동일하게 나왔습니다. 위와같은 방식으로 @PostConstruct와 @Component 애노테이션을 같이 써봤는데 , 저의 짐작으로 코드를 조작하고 실행해본거라 결과는 똑같이 나왔지만 혹시 이런식으로도 현업에서 개발을 하는건지 궁금해서 여쭤봅니다. 강의 너무 잘 듣고 있습니다. 항상 감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
핸들러 매핑의 방법에 대해 궁금한게 있습니다
강의를 듣다보니 RequestMapping 이 애너테이션 기반이라 편리해서(?) 실무에서 가장 많이 쓰신다고 하셨는데요. 스프링빈 이름도 어차피 애너테이션기반으로 @빈컴포넌트("이름") 으로 등록가능하면 스프링이 알아서 핸들러 매핑을 가져와서 찾을테니 RequestMapping과 큰 차이가 없는것 아닌가요? 뭔가 별다른 부가기능이있거나 특별히 우위를 갖는점이 있는건지 잘 모르겠습니다. 메소드단위로 매핑이 가능한점때문일까요?
-
미해결스프링 핵심 원리 - 기본편
안녕하세요! 강의를 보는 도중 문득 궁금한것이 생겨 질문드립니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(http://bit.ly/3fX6ygx)을 먼저 확인해주세요. 3. 질문 잘하기 메뉴얼(http://bit.ly/2UfeqCG)을 먼저 읽어주세요. 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 지금 빈조회까지 봤는데 실무에서 자연스럽게 스프링을 사용하고싶으면 빈 조회나 아니면 어노테이션컨피그컨텍스트같은것들의 사용방법들을 따로 모아서 봐야 하는지 아니면 강의를 계속 보다보면 자연스레 외워지는지 궁금합니다. 아니면 따로 추천해주실만한 공부법이 있을까요?
-
미해결스프링 핵심 원리 - 기본편
build.gradle 질문입니다.
hello 프로젝트 생성하고 build.gradle 파일에 dependencies에 exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' 이것이 추가되어 있지 않습니다. 강의하실때 보면 파일에 있는데 추가해줘야하는건가요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
강의 내용중 이미지 파일 출력 핸들러 메소드의 보안적 문제 언급에 대한 질문입니다.
안녕하세요. 이번 강의 내용에서 이미지 출력 처리에 있어서는 여러 방법 중 UrlResource를 사용하여 처리하는 과정을 볼 수 있었습니다. @ResponseBody@GetMapping("/images/{filename}")public Resource downloadImage(@PathVariable String filename) throws MalformedURLException { return new UrlResource("file:" + fileStore.getFullPath(filename));} 다만, 32:25 부분에서 "위 코드 만으로는 보안에 취약해 보일 수 있으니, 여러 체크 기능을 넣는 것이 좋다"라고 언급하신 부분에 대해 어떤 부분이 보안에 취약할까 생각하던 중 도무지 생각나질 않아서 좀 더 구체적인 내용을 얻어갈 수 있을까 해서 질문드립니다. 보안 이슈에 대한 설명만 해주셔도, 취약점 체크를 위한 코딩에 도움이 될 것 같습니다. 미리 답변 감사드립니다.
-
미해결스프링 핵심 원리 - 기본편
테스트에 대한 질문
안녕하세요 본 강의의 핵심 내용은 아니지만 테스트 관련해서 궁금한 점이 있어 여쭤봅니다. 1. 협업 현장에서 하나의 테스트 (@Test 1개) 에 대해서 다양한 데이터로 돌아가면서 테스트를 진행하나요? 2. 만약 그렇다면 하나의 테스트에 적용할 다수의 데이터에 대해서 디자인 패턴이 있을 것 같은데 어떤 방식으로 짜는지 궁금합니다. 2번에 대해서 구글링도 해보고 고민을 해봤는데 뭔가 정석? 이 아닌것 같아 질문 드립니다. 아래는 예제 코드입니다. // test 클래스 일부 @Test void join() { //given Member member = MemberTestUtil.getMemberSample("sample1"); //when, then 생략 } // MemberTestUtil 클래스 public class MemberTestUtil { public static Member getMemberSample(String descriptor) { Member member = new Member(); // Member는 @builder 포함 switch (descriptor) { case "sample1": member.builder().id(1L).name("memberA").grade(Grade.VIP); break; case "sample2": member.builder().id(2L).name("memberB").grade(Grade.VIP); break; // 생략 } return member; } }
-
미해결스프링 핵심 원리 - 기본편
Springboot를 사용할땐 AutoAppConfig , AppConfig가 없어도 되는건가요?
@SpringBootApplication 에 @ComponentScan이 존재하니 CoreApplication을 최상단에 두고 하면 정상적으로 돌아간다고 이해해도 되는걸까요? @SpringBootApplication에 존재하는 @ComponentScan에는 필터가 존재한다고 했는데 , 이 필터에 해당되는 클래스만 수동으로 빈으로 등록하고 싶을때 AutoAppConfig를 쓰면 될까요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
스프링 웹 프로젝트에서 서블릿 필터, 인터셉터, AOP가 선언된 경우 AOP가 동작하는 시점에 대한 질문입니다.
안녕하세요. 스프링 MVC Part.2 강좌에서 필터와 인터셉터를 배우고나서, 서블릿 필터, 스프링 인터셉터, AOP가 모두 선언이 되어 있는 경우 AOP가 동작하는 시점에 대해 질문을 드리고자 글을 남깁니다. [강의 자료에서 가져온 필터, 인터셉터의 동작 과정] HTTP 요청 -> WAS -> 필터 -> 서블릿(디스패처 서블릿) -> 스프링 인터셉터 -> 컨트롤러 동작 과정을 보다가 문득 든 생각입니다. '그럼 AOP는 어느 구간에서 요청을 캐치해서 동작하는거지?' 예를 들어, 공통 관심 사항(메소드 실행시간 체크)을 처리하는 AOP를 @Around(핵심 기능 실행 전/후 동작)로 선언했다면 AOP가 동작하는 과정은 아래 과정이 맞을까요? HTTP 요청 -> WAS -> 필터 -> 서블릿(디스패처 서블릿) -> 스프링 인터셉터 -> AOP -> 컨트롤러 무조건 위 과정이 맞는지 아니면 공통 관심 사항을 적용하는 방법(메소드 실행 전, 후, 전+후)에 따라 바뀌는지 궁금합니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
HomeConroller의 핸들러 메소드에서 로그인 정보를 담는 member 객체에 대한 질문입니다.
안녕하세요, 로그인 처리2 - 필터, 인터셉터 파트의 'ArgumentResolver' 활용편에서 궁금한 사항이 있어 질문 글을 작성해 봅니다. HomeController에서 '/' URL에 대한 핸들러 메소드 선언시 'member' 파라미터에 대해서는 @Login 어노테이션을 선언하여 직접 구현한 LoginMemberArgumentResolver를 통해 세션에 담긴 로그인 객체를 바인딩(?) 시켜주는 과정을 확인할 수 있었습니다. 만약, HomeController에서 '/' URL 요청 매핑 외 다른 URL 요청 매핑을 처리할 수 있는 여러 핸들러 메소드가 선언되고, 기획자 또는 클라이언트의 요구사항에 따라 HomeController에서 처리되는 모든 핸들러 메소드에 대해서는 로그인 객체를 이용하여 무언가 분기 처리를 해야하는 로직이 포함되어 있어야 한다면(분기 처리는 각기 다른 로직을 포함하고 있습니다.) HomeController에 존재하는 모든 핸들러 메소드의 파라미터로 '@Login Member member'가 선언이 되어야 할 것 같다라는 생각이 들었습니다. 이 또한 반복적인 코드가 아닐까 싶은데요. HomeController에서 '전역적'으로 로그인 정보를 포함하고 있는 객체를 선언하고, 이를 핸들러 파라미터로 굳이 선언하지 않아도, 각 핸들러 메소드에서 사용할 수 있는 방법이 있을까요? P.S HTTP 요청 -> WAS -> 필터 -> 서블릿(디스패처 서블릿) -> 스프링 인터셉터 -> 컨트롤러 흐름을 생각해 보면... 서블릿 필터 또는 인터셉터를 통해 매 요청에 세션에 담긴 로그인 정보를 핸들러 메소드에 각각 다시 주입(?) 시켜줘야 할 것 같은데 실무에서 보통 이렇게 처리하는지 아니면 다른 방법이 있는지 궁금합니다. 미리 답변 감사드립니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
AOP와 서블릿 필터/스프링 인터셉터의 사용 시점에 대한 질문입니다.
안녕하세요. 서블릿 필터 - 소개 강의 내용 4:45 부분에서 '웹과 관련된 공통 관심사는 AOP보다 서블릿 필터 또는 스프링 인터셉터를 이용하는 것이 좋다.' 라는 말씀을 언급해 주셨는데요. 스프링 입문 강의 파트에서 AOP에 대해서 맛보기로 다룰 때 예제 코드에서는 특정 메소드의 실행 시간을 출력해 보는 용도로써 AOP 기술을 사용해 본 적이 있습니다. 여기서 궁금한 것은 실무에서. 물론 규모에 따라 다르겠지만, 보편적으로 웹과 관련된 공통 관심사를 서블릿 필터와 스프링 인터셉터로 구현했다면 AOP를 사용하여 구현할 공통 관심사항에는 메소드 실행시간 외 어떤 것들이 있는지 궁금합니다. 미리 답변 감사드립니다.
-
해결됨
스프링으로 쇼핑몰을 만들고 싶어요.
안녕하세요. 입문 비전공자입니다. 단순히 목표가 스프링 프레임워크로 쇼핑몰을 만들어보자 입니다. 목표 설정 이유는, 한국에서 자주 쓰이는 프레임워크가 스프링으로 알고있고, 쇼핑몰을 만들게되면 어느정도 웹사이트에 대해서 알 수 있지 않을까 싶어서입니다. 목표는 바꾸지 않을 예정이고, 처음부터 백지상태로 공부할 생각입니다. (간단한 교양프로그래밍만 해본 정도입니다.) 혹시 참고할만한 로드맵이나 강의가 있을까요? 감사합니다. p.s 프레임워크는 바뀌어도 괜찮습니다. 죽는 한이 있더라도 실제 결제가능한 쇼핑몰을 어떻게든 만들고 싶습니다.
-
미해결
백엔드 목표로 공부하고있습니다 자바 문법은 어느정도 공부해야될까요?
현재 혼자서 자바를 책으로 공부하고있습니다. 인프런에서 백엔드 로드맵을 보면서 강의를 듣고싶은데 자바의 문법은 얼마나 공부해야될까요? 지금 혼자공부하는자바 완독했습니다.
-
미해결
no mapping for get 문제
main.jsp로 현재 매핑중인데 pom.xml, root-context, servlet-context를 아무리 찾아봐도 어느부분이 틀린지 몰라서 질문을 올립니다.... main.jsp를 불러오기 위한 컨트롤러입니다. 리턴으로 받아봐서 해결해보려고 햇으나 메인으로 돌아오기 위해 redirect시에 오류가 생기더군요.. pom.xml부분의 servlet부분입니다. servlet-context입니다. root-context입니다. hikariconfig에서 디비쪽 네임과 비번은 잠시 지워뒀습니다. mapping상 잘못된 부분이 없어보이는데 계속 WARN : org.springframework.web.servlet.PageNotFound - No mapping for GET / getmapping을 할 수없다고 떠서 급하게 글을 올려봅니다.
-
미해결스프링 핵심 원리 - 기본편
궁금한점이 있습니다.
@Testpublic void lifeCycleTest() { ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class); NetworkClient client = ac.getBean(NetworkClient.class); ac.close();}@Configurationstatic class LifeCycleConfig { @Bean public NetworkClient networkClient() { NetworkClient networkClient = new NetworkClient(); networkClient.setUrl("http://hello.dev"); return networkClient; }} 여기에서 setUrl을 통해서 url을 지정했는대 ac.getBean(NetworkClient.class)에서는 왜 null이 나오는건지 잘 모르겠습니다.
-
미해결스프링 핵심 원리 - 기본편
스프링 공부 방법
안녕하세요 김영한개발자님! 저는 현재 강사님의 스프링 로드맵을 따라 수강 중인 대학교3학년 학생입니다. 다름아니라, 스프링으로 웹 개발 프로젝트(간단한)를 혼자 해보고 싶은데, 공부를 시작한지 얼마 안되어서 언제 어떤 식으로 진행을 해야 할지 막막해서 질문을 남깁니다. 1. 스프링 강의를 다 들은 다음에 프로젝트를 시작하는 것이 좋을 까요? 2. 웹 페이지 구현을 하려면 처음부터 끝까지 혼자 다 짜보는게 좋은가요? (학교에서 html, css, javascript를 간단하게 해본적이 있고, 스프링은 처음입니다.) ps. 항상 열심히 강의해주셔서 감사합니다.^^ 많은 것을 배워가고 있습니다.
-
미해결
스프링에서 서브쿼리 처리방식 질문드립니다.
스프링 공부를 하면서 jpa를 사용해서 개발을 하다가 jpa로는 서브쿼리에 한계가 있는것 같아서요. 예를 들면 select class, c_time, professor,~~~~ FROM 컴공과목테이블 where 기본키 = (select 참조키 from 학생테이블 where 학생명="홍길동") ('홍길동' 학생이 수강신청 되어있는 컴공 과목정보를 뽑기 위한 쿼리입니다) . 이런식의 서브쿼리로 SELECT하고 싶을땐 어떤방식으로 자바코드를 짜야하나요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
안녕하세요 선생님
지금까지 강의 너무 잘듣고 있습니다. 요즘은 선생님을 알고 스프링을 쉽게 배울 수 있게 해주셔서 행복합니다 ㅎㅎ 앞으로 이어질 강의 많은데 이번 강좌는 스프링 맛보기라 생각하고 다음 강의를 계속 진행하면 될까요? 예를들어 이번 강의 JdbcTemplate를 깊이 있게 알려주시는 강의라던가 말입니다. 선생님의 훌륭한 강의를 계속 들으면서 공부하게 되면 현업에서 필요로 하는 개발자가 될 수 있을까요? 저의 바램은 준비해주신 강의를 전부 다 듣고 혼자서 포트폴리오도 만들만한 실력을 원해서 그렀습니다..ㅎㅎ 항상 밝고 친절하게 쉽게 알려주셔서 너무너무 감사합니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
의존성 주입 방식, 컴포넌트스캔과 자바설정방식 관련질문입니다
안녕하세요! 강의 너무 잘 보고 있습니다. 스프링 혼자 공부해보려다가 넘 어려워서 안하게 됬는데, 흥미롭게 진행해주시는 강의듣고 조금씩 알아가는 것 같아 스스로도 기쁘고 감사합니다.ㅎㅎ 질문1 [스프링 빈과 의존관계]-[자바 코드로 직접 스프링 빈 등록 하기] 강의 7분 26초 에서 setter 주입 방식의 단점으로... 어플리케이션 로딩 시점에 한번 세팅되고 나면 이 멤버변수는 바꿀 일이 없는데 public으로 노출되게 된다는 점이 단점이라고 설명해주셨습니다. 그런데 6분 0초 필드 주입방식을 설명해주실 때 단점으로... 스프링이 시작될 때, 초기에만 설정되고 개발자가 동적으로 바꿀 수 없어서 추천하지 않는 방식이라고 설명해주셨는데요! 질문은! 어플리케이션 로딩 시점에 한번만 세팅되면 되는 거면, 필드 주입방식에서 초기만 설정되고 나중에 바꿀 수 없다는 점이 왜 단점이 되는 건지 이해가 잘 안됩니다! 한번 더 단점을 정리해주실 수 있을까요? 질문2 [스프링 빈과 의존관계]-[자바 코드로 직접 스프링 빈 등록 하기] 강의 2분 40초 에서 memberRepository() 메소드 반환형을 왜 MemoryMemberRepository 타입으로 하지 않고, 인터페이스 타입으로 하신 건지 궁금합니다. + 11분 25초 부분까지 강의를 들으니 알겠네요. ^^상황에 따라 다른 데이터베이스를 연결하는 내용의 리포지토리를 연결할 때, 서비스나 컨트롤러 코드를 변경하지 않고, 아래 파일에서 new 하는 객체만 원하는 리포지토리로 바꿔주면 되니까 그런거군요! package hello.hellospring.service;import hello.hellospring.repository.MemberRepository;import hello.hellospring.repository.MemoryMemberRepository;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class SpringConfig { // @Bean : spring bean을 등록할 거라는 의미 @Bean public MemberService memberService(){ return new MemberService(memberRepository()); } @Bean public MemberRepository memberRepository(){ return new MemoryMemberRepository(); }} 질문3 : 컴포넌트스캔방시과 직접자바설정방식 차이 잘 이해한건지 확인부탁드립니다. 컴포넌트 스캔방식 : 스프링은 @Controller, @Service, @Repository 어노테이션이 붙은 것들을 빈으로 등록해 관리한다. @Autowired로 각 빈들을 연결해준다. 직접자바설정 방식 : @Configuration과 @bean으로 스프링에 빈을 등록한다. @Autowired로 각 빈들을 연결해준다. 그런데, 이 강의에서 직접 자바 config를 만들때, @Service, @Repository, @Autowired는 지웠는데, @Controller 은 지우지 않았습니다. 이유가 무엇인가요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
[해결됨]통합 테스트 시 회원가입 db연동이 안되는데 이유를 모르겠습니다 [해결]
[현재 해결했습니다!] 안녕하세요 강의 잘 듣고 있습니다! 스프링 통합 테스트 부분을 듣는 중, 회원가입 테스트코드를 실행시킨 후, h2 데이터베이스를 봤더니 'spring'이라는 이름의 회원이 db에 등록이 되지 않아 질문드립니다. 그전까진 데이터베이스에 3명 회원 연동도 잘 됐는데, 왜 이번엔 db연동이 안되는지 모르겠습니다. 우선 아래 사진들만 첨부하겠습니다. 필요한 사진 및 내용이 있으시면 답변에 달아주시면 바로 추가하겠습니다! 감사합니다. ------------------------------------------------------------------------------------- 강의를 3분정도 더 들어보니 transactional 어노테이션이 db 롤백을 해주는군요 좀 더 들어보고 질문을 할 걸 그랬나봅니다. 항상 수업 잘 듣고있습니다! 감사합니다.