묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
경로 질문드립니다.
안녕하세요. @GetMapping("/hello") public void hello(Model model){ model.addAttribute("data", "hello!"); } 웹 브라우저에서 hello 경로로 접근할 때 컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버가 화면을 찾아서 처리한다고 하셨는데 return 반환값이 없는 void로 해도 접근이 가능해서요. hello 경로에 접근하면 스프링 내부에서 resources -> static -> templates 순서대로 hello.html이 있는지 확인하는게 아닌가 싶어서 질문드립니다!
-
미해결스프링 핵심 원리 - 기본편
@Primary, @Qualifier 우선순위
수업 항상 재밌게 잘 듣고 있습니다ㅎㅎ https://www.inflearn.com/questions/409588 해당 글과 같은 의문점이 들어서 선생님 말씀대로 직접 테스틀 해보았습니다. 1) rateDiscountPolicy 스프링 빈에 @Primary 를 설정하고, 2) fixDiscountPolicy 스프링 빈에 @Qualifier("subDiscountPolicy") 이렇게 설정했습니다. @Autowiredpublic OrderServiceImpl(MemberRepository memberRepository, @Qualifier("subDiscountPolicy") DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; System.out.println("discountPolicy = " + discountPolicy);} 둘 중에 뭐가 더 우선권이 높은지 확인해보기 위해 OrderServiceImpl의 생성자에서 discoutnPolicy를 출력하는 코드를 추가하고 기존에 작성한 AutoAppConfigTest 테스트 코드를 실행해봤는데, discountPolicy = hello.core.discount.FixDiscountPolicy@74a6a609 다음과 같이 2)에서 설정한 fixDiscountPolicy가 주입된 것을 확인했습니다. 1. 우선 순위부분에서 @Qualifier > @Primary 이기 때문에, 동시에 적용했을 때 다음과 같은 결과가 나오는게 맞는 건가요?? 2. 아래 글에 따르면, 메인 DB의 커넥션을 획득하는 스프링 빈은 @Primary를 지정, 서브 DB의 커넥션을 획득하는 스프링 빈은 @Qualifier를 지정한다고 하였습니다. 그런데 위에서처럼 @Primary, @Qualifier를 각 스프링 빈에 지정해 놓으면, 어떻게 때에 따라 해당 빈이 주입되도록 할 수 있나요??.. 1번의 OrderServiceImpl 생성자처럼 @Qualifier 코드를 추가해놓으면 항상 우선순위에 따라 빈에는 서브 DB 커넥션을 획득하는 스프링 빈(예제에서는 FixDiscountPolicy)가 들어가게 되지 않나요?? 3. 아래 질문의 내용처럼 직접 테스트를 해보니 @Autowired 필드명 매칭 방식 보다 @Primary 방식이 우선권이 더 높다는 것도 확인했습니다. https://www.inflearn.com/questions/129469 그러면 전체 우선권은 @Qualifier > @Primary > @Autowired 필드명 매칭 이렇게 되는 건가요??
-
미해결
강의 학습법에 대해서 질문 드리고 싶습니다.
원래 뭔가를 만들다가 필요한 부분만 찾아서 강의를 듣는 스타일이었는데,최근에 어떤 프로젝트에 참여하기 위해JPA랑 Spring을 공부해야 되는 상황입니다. 해서 영한님의 강의를 듣고 있는데요. 강의를 듣다 보니, PDF에 정리해주신 것 말고도말씀으로 정리해주시는 부분 중에 너무 중요한 내용들이 자주 나와서필기를 할 수 밖에 없더라고요 애초에 제가 필기하며 정리하는 학습법이 기억에 잘 남는다고 여기는 것도 있고.. JPA든 Spring이든 완강하기 까지 내용이 엄청나게 방대한데이거를 꼼꼼히 정리해가며 학습하면후에 프로젝트에 들어갈 때 제 기억속에 다 남아있진 않아도,적어도 빠르게 필기한 부분을 참고해서 원하는 부분을 발췌할 수 있을 것 같아서 필기를 하는 것도 있는데요. 문제는 프로젝트에 들어갈 시간이 며칠 안남았습니다!1) 짧은 시간내에 완강을 할려면 필기를 하지 않고 설렁설렁 빠르게 들어야하는데,이렇게 빠르게 대충 듣고 프로젝트를 시작하는게 좋을지 2) 3분의 1만 듣고 프로젝트를 시작하는 한이 있더라도 필기하면서 어느정도 이해하고들어가는게 좋을 지 모르겠습니다. 이런 딜레마에 빠져있구요.. 혹시나 영한님처럼 프로그래밍 학습과 프로젝트에 있어 많은 경험을 하신 분이라면,확답을 내려주실 수 있지 않을까 하여 여쭤보아요.
-
미해결스프링 핵심 원리 - 기본편
질문있습니다!
안녕하세요! 강의 너무 재밌게 잘 듣고 있습니다. 몇가지 질문이 있는데요! 1. OrderServiceImplTest의 createOrder() 가 순수한 자바로 테스트하는 코드라고 하셨는데, 정확히 그 의미가 어떤 것 인가요?? 스프링 컨테이너를 생성해서 getBean(OrderService.class) 이런식으로 받아오지 않고 new OrderServiceImpl()로 생성해서 테스트하기 때문인가요?? 2. 4분 28초쯤에 createOrder() 테스트를 실행하면 오류가 나서 선생님께서 AppConfig의 orderService()의 return을 null로 바꾸셨습니다. 저는 createOrder()에서 new orderServiceimpl() 생성자를 호출하면 OrderServiceImpl 클래스의 디폴트 생성자가 호출된다고 생각했는데, 오류가 왜 AppConfig에서 나는 건가요?? 왜 저기 코드를 고쳐야하는건지 이해가 잘 가지 않습니다ㅠㅠ
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
MessageSource를 ms로 바꾸면 Could not autowire라고 나옵니다.
제목과 같이 MessageSource 변수명을 ms로 바꾸면 빨간줄이 나오는데 어떻게 해결해야 하나요? 강의 소스를 열어도 똑같이 빨간줄이 나옵니다.ㅜㅠ @Aotuwired위에 @Qualifier("messageSource") 를 하면 되기는 하는데 왜 저는 @Qualifier을 해야 되는 걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderService에서 OrderItem접근
OrderService에서 OrderItem접근이 어떻게 가능한지 궁금합니다. OrderService @Transactionalpublic Long order(Long memberId, Long itemId, int count) { // memberId를 가져오기 위해선 MemberRepository있어야 함 //엔티티 조회 Member member = memberRepository.findOne(memberId); Item item = itemRepository.findOne(itemId); //배송정보 생성(회원정보 Address) Delivery delivery = new Delivery(); delivery.setAddress(member.getAddress()); //주문상품 생성 OrderItem.createOrderItem() // [질문한 부분]} 혹시 어떠한 도메인 이든 , Controller, Service, Repository에 접근 가능해서 그런걸까요?!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
파라미터 ...
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Order에 생성 메서드를 구현할때 파라미터에 ... 넣는 의미를 모르겠습니다. 어느 경우에 사용하나요? public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) { }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Mysql 인메모리DB 설정, 로그 쿼리남기기
안녕하세요, 저는 처음부터 H2데이터베이스가 아닌 MySQL을 연결해서 사용하고 있습니다. 테스트 코드 작성 후 여러 이점으로 메모리디비 연결 하는 방법을 알려주셨는데, Mysql의 경우도 할 수 있나요? 현재 dependencies에 implementation 'mysql:mysql-connector-java' 추가된 상태입니다. 추가적으로 로그에 쿼리남기는 것도 보고싶어서, dependencies에 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6' 만을 추가한 상태입니다. 로그에 남는것 같기는 한데 선생님처럼 예쁘게 보이는 것이아닌 줄글처럼 나오는데요, 혹시 추가하거나 봐야할 게 있을까요? application.properties에는 이렇게 설정했습니다, # JPA Settingsspring.jpa.hibernate.ddl-auto=createspring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.show_sql=true
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
소소한 궁금증. response.setCharacterEncoding("utf-8"); 질문
@Slf4jpublic class UserHandlerExceptionResolver implements HandlerExceptionResolver { private final ObjectMapper objectMapper = new ObjectMapper(); @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { try { if (ex instanceof UserException) { log.info("UserException resolver to 400"); String acceptHeader = request.getHeader("accept"); response.setStatus(HttpServletResponse.SC_BAD_REQUEST); if ("application/json".equals(acceptHeader)) { Map<String, Object> errorResult = new HashMap<>(); errorResult.put("ex", ex.getClass()); errorResult.put("message", ex.getMessage()); String result = objectMapper.writeValueAsString(errorResult); response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); response.getWriter().write(result); return new ModelAndView(); } else { //TEXT/HTML return new ModelAndView("error/500"); } } } catch (IOException e) { log.error("resolver ex", e); } return null; }} mvc 1편에서 ContentType : application/json은 원래 utf-8을 쓰게 되어 있어서 charset=utf-8 즉, response.setCharacterEncoding("utf-8"); 는 의미 없는 파라미터가 추가되는 것이라고 하셨는데 여기서 response.setCharacterEncoding("utf-8"); 코드를 쓴 다른 이유가 있는 건가요 ?
-
미해결실전! 스프링 데이터 JPA
프록시 초기화
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 강의 코드를 실행해보다가 궁금한점이 생겨서 질문드립니다. 예전에 MemberTest 클래스에서 아래 코드를 실행했을때는 member.getTeam() 에서 team에 대한 select 쿼리가 나가면서 프록시 초기화가 발생했습니다. @Test public void testEntity() throws Exception { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, teamA); Member member3 = new Member("member3", 30, teamB); Member member4 = new Member("member4", 40, teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); //초기화 em.flush(); em.clear(); //확인 List<Member> members = em.createQuery("select m from Member m", Member.class) .getResultList(); for (Member member : members) { System.out.println("member = " + member); System.out.println("-> member.team = " + member.getTeam()); } } 하지만 MemberRepositoryTest 클래스에서 아래의 코드의 경우 member.getTeam() 으로 하면 team에 대한 select 쿼리가 나가지 않고 프록시 초기화가 발생하지 않습니다. 이 두가지 테스트의 차이가 무엇이길래 처음 테스트는 getTeam()으로 프록시 초기화가 되고 두번째 테스트는 getTeam()만으론 안되고 getTeam().getName() 까지 해야 프록시 초기화가 될까요? @Test public void findMemberLazy() throws Exception { //given //member1 -> teamA //member2 -> teamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); memberRepository.save(new Member("member1", 10, teamA)); memberRepository.save(new Member("member2", 20, teamB)); em.flush(); em.clear(); //when List<Member> members = memberRepository.findAll(); //then for (Member member : members) { member.getTeam(); System.out.println("Team = " + member.getTeam().getClass()); } }
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
실무에서 커넥션 풀 사용시 maximum풀사이즈 산정은 어떻게 하는지 궁금합니다.
안녕하세요. 강의 잘보고 있습니다. 강의 보다 궁금한 점이 실무에서 커넥션 풀 사용시 maximum풀사이즈 산정은 어떤 과정으로 산정을 하나요? (배민같이 대량의 트래픽을 받아줘야 하는 경우) 뭔가 톰캣 쓰레드 갯수와 커넥션 풀 갯수를 적절하게 맞춰서 셋팅을 해야 할것 같은데 산정 과정이 어떻게 되는지 궁금합니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
DB없이 데이터 저장이 어떻게 가능한지 궁금합니다.
ㄱ학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.안1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 강사님, 안녕하세요. 강의 정말 잘 듣고 있습니다. 스프링 서버만 구현하여서 데이터가 저장되는데, 이것이 어떻게 가능한지 궁금합니다. 답변 부탁드립니다. 감사합니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
새 탭으로 이미지 열기 질문입니다.
강의내용중 31:24초 부분에 해당하는 질문입니다. 다른 사이트 이미지를 마우스 우클릭후, '새탭으로 이미지 열기'로 보면 제대로 이미지가 새탭으로 출력이되서 보이는데, 이 프로젝트 코드는 새 탭으로 이미지 열기를 사용하는데 31:20초 /items/1 경로의 이미지처럼 나오지않고 문자형태로 출력이되는지 궁금합니다. 또한 이처럼 31:24초처럼 이미지가 문자형태로 출력되지 않고 다른사이트(구글,네이버)처럼 새탭으로 이미지를 열어도 정상적으로 이미지가 출력되게 하기위해선 어떻게 해야하나요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Spring 재시작시 상품 데이터가 사라지는데, hibernate ddl-auto 설정 때문인가요?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] Spring이 런타임에서는 상품을 잘 저장하고, 불러오는 것도 정상적입니다. 그런데 스프링을 Re-Run 하게 되면, 상품이 전부 사라지네요. ddl-auto: create를 update로 바꿨더니 데이터가 안 사라지네요. 이거 말고 다른 이유는 없는 건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
굳이 Proxy 객체로 감싸서 반환하는 이유가 무엇인가요,,,,
강의 도중 중요한 내용은 아니라고 하셨지만 궁금해서 이렇게 질문을 남깁니다. 커넥션을 사용하고 반환하는 과정에서 Proxy로 감싸지 않고 반환하면 다시 재사용하는데 있어서 어떤 문제가 발생하는 것인지 궁금합니다. 또한, Proxy 로 감싸서 얻는 이점이 무엇인지도 궁금하네요.. 강의 감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
팩토리 메서드 관련해서 질문이 있습니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] 안녕하세요!! 강의를 보면서 팩토리 메서드에 대해 궁금증이 몇가지 생겼는데 구글링을 해봐도 잘 나오지 않아서 질문 올립니다🥲 1. 팩토리 메서드를 사용하는 기준이 있을까요? 생성자를 통해 객체를 생성하지 않고, 팩토리 메서드를 사용하는 경우 이름을 가질 수 있다, 하위 타입 객체를 반환할 수 있다 등등의 장점이 있고, 이에 반해 몇몇 단점도 있는것 같은데 단순히 팩토리 메서드 내부에서 생성자만 호출하는 경우에도 실무에서는 팩토리 메서드를 웬만하면 다 사용하는 편인가요?? 생성자 대신 팩토리 메서드를 사용하여 객체를 생성하는 상황이나 기준이 있는지 궁금합니다! 2. 팩토리 메서드를 사용하는 경우 프로젝트에서 네이밍 규칙을 어떻게 가져가는 것이 좋을까요? 강의를 듣고 복습하면서 Order와 같이 연관 관계들이 얽혀있는 팩토리 메서드는 createOrder와 같은 좀 더 의미있는 이름을 사용하고, 그냥 단순히 객체만 생성하는 경우에는 of를 사용해서 실습을 해보았습니다! 실무에서 프로젝트를 진행하면 위와 같이 어떠한 룰을 만들어서 사용하시는지, 아니면 하나의 이름으로 통일해서 가져가시는지 궁금합니다 ㅎㅎ 감사합니다😀
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
4분 쯤에 post 방식으로 전송했을 때, 개발자 도구에 form data가 안나오네요..
저는 영한님이랑 다르게 user-agent 까지만 나오고 form-data 부분이 안나옵니다. 어떻게 확인할 수 있을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
해킹의 가능성에 대해 질문있습니다
세션 과정을 위의 표와 같이 이해했습니다. 영한님께선 세션Id가 털려도 여기에는 중요한 정보가 없다. 즉 털려도 상관없다라는 식으로 말씀하셨는데, 위 표와 같이 제가 이해한게 맞다면 결국 해커가 세션 키만 안다면 해킹을 할 수 있는게 아닌가?라고 생각이 들었습니다. 맞는 방식인지는 모르겠으나 테스트를 해봤습니다 두 개의 창을 띄워 각 다른 아이디로 로그인 했습니다. 표 처럼 B의 세션키를 A에 적용했을 때 B로 바뀌는 모습을 확인할 수 있었습니다. 근데 이게 될 때도 있고 안 될 때도 있습니다.. 정확한 이유를 모르겠네요 물론 해킹을 100% 막을 순 없겠지만 생각보다 쉽게 털리는 것이 아닌지 의문점이 생겼는데, 제가 무엇을 잘못 알고있는걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 질문 드립니다
안녕하세요 강의를 듣다가 연관관계와 관련해서 질문이 있어 여쭤봅니다 만약 id(pk값) 이 4 인 Order의 OrderItem 리스트에서 count가 5인 값만 가지고 온다고 하면 이걸 가져올 수 있는 방법이 있을까요??
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
경로는 찾으나 에러가뜹니다
이미지는 엑박으로 표기.->새탭에서 이미지열기시, 나오는경로-http://localhost:8080/images/C:/Users/계정/springfile/images/c3a2eedd-4364-4f3f-a275-a800512e4949.png 파일다운로드 클릭시 경로와 에러페이지,http://localhost:8080/attach/C:/Users/계정/springfile/uploadfiles/9aa381e7-6b8d-412a-bf86-28caf5b29010.pdf 으로 됩니다. ---- save시 컴퓨터 경로에 사진, 파일이 저장이되고db에도 잘 저장됩니다.. 코드 <img th:each="imageFile : ${board.attachFiles}" th:if="${imageFile.attachType.toString().equals('IMAGE')}" th:src="|/images/${imageFile.storeFileName}|" width="300" height="300" style="margin-right: 5px"/> <a th:each="uploadFile : ${board.attachFiles}" th:if="${uploadFile.attachType.toString().equals('FILE')}" th:href="@{/attach/{filename}(filename=${uploadFile.storeFileName}, originName=${uploadFile.uploadFileName})}" th:text="${uploadFile.uploadFileName}" style="margin-right: 5px"/><br/> @ResponseBody@GetMapping("/images/{filename}")public Resource processImg(@PathVariable String filename) throws MalformedURLException { return new UrlResource("file:" + fileStore.getFullPath(filename, AttachType.IMAGE));@GetMapping("/attach/{filename}")public ResponseEntity<Resource> processAttaches(@PathVariable String filename, @RequestParam String originName) throws MalformedURLException { UrlResource resource = new UrlResource("file:" + fileStore.getFullPath(filename, AttachType.FILE)); String encodedUploadFileName = UriUtils.encode(originName, StandardCharsets.UTF_8); String contentDisposition = "attachment; filename=\"" + encodedUploadFileName + "\""; return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition) .body(resource);}