묻고 답해요
144만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티 OAuth2
네이버 로그인 시 권한
네이버로 로그인하면 권한이 yml에 설정한 scope - email, profile은 넘어오지 않습니다. 강사님과 코드도 동일한데 어디를 확인해봐야할까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
value값이 무엇인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요. package hello.hello_spring.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class HelloController { @GetMapping("hello-api") @ResponseBody public Hello helloApi(@RequestParam("name") String name) { Hello hello = new Hello(); hello.setName(name); return hello; } static class Hello { // key: name private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } }이 코드에서 key 값은 name이고 value값은 어떤 것인지 알 수 있을까요? 제가 못 알아들어서요ㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
입력 매개변수 Model model의 유무
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요. 입력 매개변수로 Model model을 쓰는 상황과 안 쓰는 상황을 구별하지 못하겠습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
return "hello"가 html인지 string 값인지 어떻게 구별할 수 있나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.<첫 번째 예시>섹션 2 - View 환경설정에서의 예시 코드@GetMapping("hello") public String hello(Model model) { model.addAttribute("data", "hello!!"); return "hello"; }여기에서 return 값은 hello.html의 이름과 같아야 하기 때문에 return "hello"라고 해야 한다고 하셨는데 "hello.html"인지, String "hello"인지 어떻게 구별할 수 있을까요? 정적 컨텐츠일 때에는 항상 html의 이름과 같은 문자를 return해줘야 하나요? <두 번째 예시>섹션 3 - API 강의에서 첫 번째 예시@GetMapping("hello-string") @ResponseBody public String helloString(@RequestParam("name") String name) { return "hello " + name; }여기에서 return 값이 "hello " + name인데 "hello.html"인지, String "hello"인지 어떻게 아나요? 이때는 항상 String 값을 return해줘야 하나요?-------------------------------------------------입력 매개변수로 Model model을 쓰는 상황과 안 쓰는 상황이 잘 이해가 안 감
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
RememberMeService가 필요한 이유?
안녕하세요. 강의 잘 듣고 있습니다!저의 질문은RememberMe의 존재 이유를 잘 모르겠습니다.로그인이 안풀리게 하려는건가요 ?그러면 세션의 유지시간을 길게 잡을 수 있을 것 같은데, 복잡하게 JSESSIONID와 REMEMBER 조합으로 쓰는 이유가 와닿지가 않네요. 어떠한 이유로 이게 생긴것이고, 어떤 상황에서 유용하게 쓸 수 있을까요?감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
spring data jpa로 반환할 때
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@EntityGraph를 이용하여 페이징 한계를 돌파할 때 리포지토리public interface OrderRepository extends JpaRepository<Order, Long> { @EntityGraph(attributePaths = {"member", "delivery", "orderItems", "orderItems.item"}) Page<Order> findAll(Pageable pageable);}컨트롤러단@GetMapping("/api/v3.1/orders") public List<OrderDto> ordersV3_page( @RequestParam(value = "offset", defaultValue = "0") int offset, @RequestParam(value = "limit", defaultValue = "100") int limit ) { Pageable pageable = PageRequest.of(offset, limit); Page<Order> orders = orderRepository.findAll(pageable); return orders.stream() .map(OrderDto::new) .collect(Collectors.toList()); }이렇게 코드를 작성하면 orderItems 이것이 @OneToMany관계에 있어 DB의 데이터가 늘어나게 되기 때문에(orderItem개수에 따라) @EntityGraph(attributePaths = {"member", "delivery"}) 이렇게 적고 컨트롤러 단에서 동일하게 실행하게 되면 OrderDto::new 이것을 실행하게 되면서 Lazy전략으로 값을 가져오게 되어 페이징을 올바르게 처리할 수 있고, 만일 이때 값을 한번에 묶어서 가져오고 싶으면 @BatchSize를 이용하는 것으로 이해하였는데 올바르게 이해한 것인지 궁금합니다.
-
미해결스프링 부트 - 핵심 원리와 활용
스프링 레거시에서 프로메테우스를 통한 메트릭 수집
강사님 안녕하세요. 만약 스프링부트가 아닌 스프링 레거시 프로젝트와 같은경우cpu 사용량확인 및 메모리 확인 엔드포인트, 메트릭api 를 직접 구현해서 프로메테우스에서 수집하도록 해야할까요? 스프링 레거시프로젝트에서는 Actuator 라이브러리를 못쓰는걸로 알거든요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
cmd 실행 후 종료 안 됨
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요. cmd로 java -jar hello-spring-0.0.1-SNAPSHOT.jar을 실행해서 웹 페이지가 잘 실행되는 것까지 확인이 되는데 그 이후 실행 종료가 안 됩니다 (아무것도 입력이 안 되는 상태입니다) 이럴 땐 어떻게 해야 할까요?^C도 입력해봤는데 2번째 화면 그대로 입니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
helloServlet작성후 웹페이지가 열리지않습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]HelloServlet를 작성하기전에는 정상작동합니다 근데 HelloServlet를 작성한후 클래스를 찾을수없다는 내용이 나옵니다
-
해결됨실전! 스프링 데이터 JPA
public void changeTeam 함수
안녕하세요. Member가 team이 바뀌면 this.team = team; team.getMembers().add(this);team이 변경되어서 현재 멤버의 팀 정보를 업데이트하고 새로운 팀에 새로운 멤버를 넣는다라고 이해했는데요,기존 팀에 속해있던 멤버 정보는 안지워도 되는걸까요? 감사합니다.
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
레이어드 아키텍처 개발에 대하여
섹션 6 진화하는 아키텍처의 3번째 강의인 핵사고날에 대한 사견 강의 중 8분 9초에 강사님께서 시스템이 명확할 때, 추상화가 너무 많이 되어있다면 쓸모없는 구역이라고 말씀하시고 Spring/JPA/RDB 이 3개를 쓸게 명확하다면 레이어드 아키텍처로 개발하라고 말씀하셨는데 그럼 기술 스택이 명확한 상황이라서 레이어드 아키텍처로 개발을 시작하게 된다면 전체적인 강의 통틀어서 말씀하셨던 의존성 역전, JPA에 종속적인 문제, 도메인 중점 개발 이런 것들이 필요 없어지게 되는걸까요?레이어드 아키텍처 개발이든 핵사고날 아키텍처로 개발을 하든 도메인을 중심으로 개발하는 것이 중요하다고 생각합니다. 하지만 의존성 역전으로 인한 추상화나 그로 인한 테스트 작성이 쓸모가 없어지게 되는걸까요?
-
미해결스프링 시큐리티 OAuth2
jwt login flow에 대해서 질문드립니다.
현재 login post 요청만 되는 것으로 확인이 됩니다.1. login post요청만 받을 수 있도록 설정되어 있는 클래스가 궁금합니다.2. 기존에 있던 loginfilter가 사라지고 현재는 어떤 필터로 대체 되었는지 알고 싶습니다.3. http.addFilterBefore(jwtAuthenticationFilter(macSecuritySigner, octetSequenceKey), UsernamePasswordAuthenticationFilter.class); http.addFilterBefore(jwtAuthorizationMacFilter(octetSequenceKey), UsernamePasswordAuthenticationFilter.class);현재 이렇게 코드가 있는데, 인증일 경우 jwtAuthenticationFilter만 권한 검증일 경우 jwtAuthorizationMacFilter로 가는지 여부 결정하는 과정에 대해서 설명부탁드립니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
초기 설정 오류 및 실행 안 됨
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]자바 버전 17스프링 부트 3.3.4위와 같이 오류가 뜨며 run 버튼이 나타나지 않습니다. 첫 번째 오류 메시지Cause: class jdk.internal.loader.ClassLoaders$PlatformClassLoader cannot be cast to class java.net.URLClassLoader (jdk.internal.loader.ClassLoaders$PlatformClassLoader and java.net.URLClassLoader are in module java.base of loader 'bootstrap') 두 번째 오류 메시지Could not configure services using BuildScopeServices.configure().> Could not configure services using BuildScopeCompileServices.configure().* 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.org.BUILD FAILED in 35ms .gradle 에서 캐시 삭제 해봤습니다.intellij 재설치 해봤습니다.프로젝트를 열 때 build.gradle 파일을 선택하였습니다.어떻게 해결하면 좋을까요...
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
hello-mvc와 hello-template
hello-template으로 return해서 hello-template.html에서 thymeleaft에 로직 처리가 되는것은 이해했으나 그걸 다시 변환후에 주소창에 보면 hello-template에서 처리를 하였는데 왜 hello-template?name=spring가 아닌 hello-mvc?name=spring가 되는건지 궁금합니다.
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
csrf POST 요청 시에 토큰값 넣어도 안되는 경우 확인해보세요
_csrf 파라미터 이름과 값 사이에 공백이 있는지 확인해보세요공백이 있을 경우 아래와 같이 공백을 지우고 다시 시도하시면 정상 작동됩니다### POST request with a header POST http://localhost:8080/csrf Content-Type: application/x-www-form-urlencoded _csrf=6LGfk2d_v1r5vsNT5VxTiI_8HIvuqSEMwVrVRCCQUXXhiSxyjNSppF5Jjz_Uiftmg3FnurzEMbONyhkhpD-wfROnYUTUuE5E
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
제가 이해를 제대로 했는지 궁금해서 질문드립니다
클라이언트 응답후 SecurityContextHolder는 계속 clear된다고 이해했습니다. 그럼 결국 Session에는 SecurityContext 가 저장되서 유지되는거고, 인증이 필요할때 해당 Session에서 SecurityContext를 꺼내 해당 요청동안에 SecurityContextHolder에 저장해서 사용한다고 이해하면 될까요?
-
해결됨스프링 부트 웹 개발 입문 - 따라하며 배우기
오류가 자꾸 나는데 왜이러는 걸까요?ㅠㅠ
server: port: 8081 spring: thymeleaf: prefix: classpath:/templates suffix: .html cache: false devtools: livereload: enabled: true restart: enabled: false datasource: driver-class-name: org.mariadb.jdbc.Driver url: jdbc:mariadb://localhost:3306/boot username: root password: mybatis: mapper-locations: classpath:sqlmap/**/*.xml configuration: map-underscore-to-camel-case: true package hello.sailing.v1.service; import hello.sailing.v1.dao.MenuDao; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Service @Log4j2 public class MenuSvc { @Autowired MenuDao menuDao; public MenuSvc() { log.info("===== MenuSvc , 생성자 ====="); } public List<Map<String, Object>> doMenu() { List<Map<String, Object>> list = menuDao.doMenu(); log.info(list); return list; } public List<Map<String, Object>> dolistOld() { List<Map<String, Object>> list = new ArrayList<>(); Map<String, Object> map = new HashMap<>(); map.put("No","1"); map.put("name","아이스아메리카노"); map.put("kind","커피"); map.put("price","2,000"); map.put("reg_day","2020.10.29"); map.put("mod_day","2021.10.29"); list.add(map); Map<String, Object> map2 = new HashMap<>(); map2.put("No","2"); map2.put("name","아이스초코"); map2.put("kind","음료"); map2.put("price","4,000"); map2.put("reg_day","2020.10.29"); map2.put("mod_day","2021.10.29"); list.add(map2); Map<String, Object> map3 = new HashMap<>(); map3.put("No","3"); map3.put("name","아이스불샷"); map3.put("kind","음료"); map3.put("price","4,500"); map3.put("reg_day","2020.10.29"); map3.put("mod_day","2021.10.29"); list.add(map3); log.info(list); return list; } } package hello.sailing.v1.dao; import org.apache.ibatis.annotations.Mapper; import org.mybatis.spring.annotation.MapperScan; import java.util.List; import java.util.Map; @Mapper @MapperScan("hello.sailing.v1.dao") public interface MenuDao { List<Map<String, Object>> doMenu(); } package hello.sailing.v1.controller; import hello.sailing.v1.service.MenuSvc; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; import java.util.Map; @Controller public class MenuCon { @Autowired MenuSvc menuSvc; @RequestMapping("/v1/menu") public String doMenu(Model model){ //Data 만들기, List, Map List<Map<String, Object>> list = menuSvc.doMenu(); //Data 송부 model.addAttribute("list",list); model.addAttribute("hello","========= MenuCon ========"); return "/v1/menu/menu"; } } package hello.sailing.v1.dao; import org.apache.ibatis.annotations.Mapper; import org.mybatis.spring.annotation.MapperScan; import java.util.List; import java.util.Map; @Mapper @MapperScan("hello.sailing.v1.dao") public interface MenuDao { List<Map<String, Object>> doMenu(); } 2024-09-27T14:34:44.599+09:00 ERROR 5176 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): hello.sailing.v1.dao.MenuDao.doMenu] with root causeorg.apache.ibatis.binding.BindingException: Invalid bound statement (not found): hello.sailing.v1.dao.MenuDao.doMenu오류를 어떻게 수정해야 할지 모르겠어요..BindindException이 왜 터질까요? id값도 맞게 써줬는데
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
BDDMockito의 when을 사용한 코드가 given 절에 있는 이유가 궁금합니다.
섹션3 - 테스트추가하기: h2를 이용한 service 테스트 에서UserService의 create 를 테스트하기 위해 Mock으로 주입된 JavaMailSender의 send를 다음과 같이 given 절에 추가하셨습니다. https://tecoble.techcourse.co.kr/post/2020-09-29-compare-mockito-bddmockito/에 따르면 BDDMockito는 given-when-then 구조의 시나리오 기반 테스트를 진행할 때, 시나리오에 맞게 테스트가 읽힐 수 있도록 도와주는 역할이라고 하였습니다. 따라서 저는 해당 코드를 when 절에 추가하였는데, 다른 분들은 어떤 의견이신지 궁금합니다...!
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
jpa 로그 정보 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]jpa 특징은 "persist" 메서드 호출 시 바로 insert 쿼리를 날리는 게 아니라 트랜잭션을 커밋하기 직전 flush 가 발생해서 insert 쿼리 로그가 뒤에 찍힌다고 설명해주셨습니다.(영상 기준 4:50 ~ 5:12) 저도 같은 테스트코드를 실행시켰으나 강의 영상과 다르게 중간에 insert 쿼리 로그가 남는 것을 확인했습니다. 영상 촬영시점보다 hibernate 버전이 업그레이드 되어 로그를 남기는 시점만 변경이 된 것일까요? 아니면 flush 시점 자체도 변경이 된 건가요?
-
미해결실전! 스프링 데이터 JPA
team.getMembers().add(this);
Member 클래스 안의 changeTeam 메소드 관련 질문있습니다.해당 메소드안에 team.getMembers().add(this); 이 부분이 들어가게 되면 팀의 멤버를 찾는 쿼리가 한 번 더 나가게 될 것 같은데, 확인 결과 쿼리가 안나가는 것으로 보이는데 어떤부분을 알아보면 될까요?