묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
과제 5번 cannot find symbol (sequencedMap) 오류
과제 5 관련 어제자 스레드에 올려주신 파일에서DiceRollResults.java package com.group.libraryapp.day5Practice; import java.util.LinkedHashMap; import java.util.SequencedMap; public class DiceRollResults { private final SequencedMap<Integer, Integer> map = new LinkedHashMap<>(); public DiceRollResults(int maxDiceNumber) { for (int i = 1; i <= maxDiceNumber; i++) { map.put(i, 0); } } public void count(int rollResult) { int updated = map.get(rollResult) + 1; map.replace(rollResult, updated); } public SequencedMap<Integer, Integer> getMap() { return map; } } cannot find symbol (class sequencedMap) 오류가 나는데, 해결방법이 있을까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
MVC와 API의 차이점
안녕하세요 강사님!!다름이 아니라 공부를 하다가 MVC와 API의 차이점(?)에 대해 알아보게 되었습니다!그래서 내린 결론이Spring MVC구조의 @Controller는 컨트롤러의 리턴값이 ViewResolver에 의해 해석되어서 특정 View가 html응답으로 전송된다.반면 REST API구조의 @RestController에 의한 호출은 View를 리턴하는 것이 목적이 아닌, 데이터를 전송하는 것을 목적으로 응답이 전송되어 진다.라고 내렸습니다.첫번째로, 위에서 제가 내린 결론이 맞는 말인지와두번째로, 그럼 MVC를 쓰는 경우와 API를 쓰는 경우가 언제인지가 궁금합니다.제가 아직 개념이 부족해서 그런건지는 몰라도 MVC를 쓰면 프론트엔드의 역할이 없어지는게(?) 아닌가 하는 착각이 들어서...답변 부탁드리겠습니다!!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품수정에서 book 타입 캐스팅 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]상품 수정할때 updateItemForm 메서드를 작성하면서Book item = (Book) itemService.findOne(itemId);이 코드를 작성하는데, 이게 가능하려면 itemService.findOne 메서드에서 리턴하는 객체가 원래 업캐스팅됐던 객체여야 가능한거 아닌가요? itemService.findOne은 itemRepository.findOne(itemId)을 리턴하고, ItemRepository의 findOne은 em.find(Item.class, id) 을 리턴합니다. 이 과정에서 언제 업캐스팅 되는건가요? 혹시 질문이 잘못 됐거나 제가 잘못 알고 있는 내용이 있다면 설명해주시면 감사하겠습니다.
-
미해결견고한 결제 시스템 구축
excludeTags 오류
안녕하세요 강사님build.gradle에서 excludeTags("TooLongTime")를 추가하고 Reload All Gradle Projects 를 하는 과정에서아래와 같이 오류가 발생합니다 Caused by: java.lang.ClassNotFoundException: org.gradle.internal.impldep.org.junit.platform.launcher.TagFilter Unable to load class 'org.gradle.internal.impldep.org.junit.platform.launcher.TagFilter'.This is an unexpected error. Please file a bug containing the idea.log file.
-
미해결스프링 부트 - 핵심 원리와 활용
라이브러리의 이름이 memory인 이유를 모르겠습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 우리가 memory-v1이라는 프로젝트를 빌드해서 나온 결과물이 바로 memory-v1이라는 jar파일이고, 이것을 라이브러리 화 한 것인데, project-v1에서 이 라이브러리를 사용한 것을 보면 다음과 같이 import합니다. import memory.MemoryFinder 여기서 라이브러리의 이름이, memory-v1이 아닌 memory로 된 이유가 있나요?!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
POST 컨트롤러를 수행한 뒤에도 현재 페이지를 보여주는 방법
POST 매핑 동작을 수행한 뒤에도 기존에 머물렀던 페이지로 리다이렉트 하는 방법이 있을까요?예를 들어, 로그아웃 버튼을 클릭한 뒤에도 기존 페이지를 보여주는 상황이 이에 해당됩니다.그렇다면 현재 페이지의 주소에 대한 정보를 컨트롤러에서 가지고 있어야 할텐데 어떤 방식으로 구현하는 것이 좋을지 궁금해서 질문 남깁니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
영속성에 대해
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 듣다가 궁금해져서요!@Transactional 어노테이션 안에 메소드에선 영속성이고 그게 아니면 준영속성이라는 말씀이신건가요??
-
미해결견고한 결제 시스템 구축
UPDATE_PAYMENT_EVENT_EXTRA_DETAILS_QUERY 실행 시 오류
안녕하세요 강사님실제 결제 테스트 진행 시 아래와 같은 오류가 발생하는데혹시 토스에서 리턴하는 값이 달라져서 값 타입이 안맞아서 그런걸까요..?강사님이 제공해주신 깃헙으로 진행하더라도 동일한 에러가 발생합니다ㅠㅠ
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
"상품 목록 - 타임리프" 강의 관련 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.thymeleaf 템플릿을 이용하여 만든 items.html의 코드 상에 <link th:href="@{/css/bootstrap.min.css}" href="../css/bootstrap.min.css" rel="stylesheet">이 부분에 대해서 질문이 있습니다.localhost:8080/basic/items 로 접속을 하면 BasicController의 items 메소드에 의해서 /basic/items.html 인 뷰 템플릿을 렌더링 하는것 까지는 이해했습니다.제가 아직 html 코드에 익숙하지 않아서 궁금한 점인데, 1번째 질문.th:href="@{/css/bootstrap.min.css}" 이 부분에서 thymeleaf가 자동으로 내부에서 localhost:8080/css/bootstrap.min.css 를 호출해서 정적 리소스 내에 존재하는 bootstrap.min.css 파일을 찾고 items.html 과의 관계(rel="stylesheet")를 정의해주는건가요...??? 2번째 질문.그래서 th: 태그가 없는 경우에는 정적으로 static/html/items.html이기 때문에 href="../css/bootstrap.min.css" ../를 통해서 static 디렉토리로 올라간 다음 거기서 부터 다시 static/css/bootstrap.min.css 를 탐색하는건가요??
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
gradle
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]2분 14초 상품 상세로 넘어가는 과정에서 다른 질문 글을보고 Gradle을 사용해서 빌드하고 실행하는 과정을 하니 해결이 되었는데요. 혹시 이방법 말고는 없나요? 느리다는 이유로 Gradle을 사용하지 않은걸로 아는데 이후에도 그냥 gradle로 사용해도 상관없나요?
-
미해결스프링 부트 - 핵심 원리와 활용
@SpringBootTest어노테이션 역할
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] @SpringBootTest역할이 정확히 무엇인지 알고싶습니다. 이 어노테이션을 붙이면 스프링 컨테이너에 등록된 빈을 사용할 수 있는것으로 알고있는데, 이걸 안붙이면 스프링컨테이너에 등록된 빈을 사용할 수 없나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
memberRepositoryTest 코드 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. https://drive.google.com/file/d/1tczZBCt9-gL3mcnTTvlFmGuGq0YqZv71/view?usp=drive_linkRepositoryTest 코드는 정상적으로 돌아가는데 DB연동이 안됩니다. 코드 돌려보면 콘솔박스에 create table도 안생기는 것 같아요(참고로 코드는 member대신 user로 모두 바꿨습니다)
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
HandlerExceptionResolver 활용 질문이 있습니다.
1.HandlerExceptionResolver 활용 8분 10초에서 40초사이 String result= objectMapper.writeValueAsString(errorResult); 이 구문에 대해서요.jason을 문자로 바꿔준다. 객체를 문자로 바꿔준다고 하셨느데요. 그래서 객체랑 jason이 같은 줄알았는데요.https://velog.io/@wong0220/%EA%B0%9D%EC%B2%B4-Object-%EC%99%80-JSON-%EC%B0%A8%EC%9D%B4 여기 링크보면 다르다고 하는데 이 링크가 틀린건가요?아니면 객체(jason)형태를 문자로 바꿔준다라는 의미로 이해해도 되나요?2.위 사진은 API 예외 처리 교재 8페이지 사진입니다. HandlerExceptionResolver 시작 강의코드에서는 위에사진 빨간색 표시된 곳에서 response.sendError가 나오는건가요? 즉 서블릿 컨테이너까지 에러가 갔다가 다시 재요청을 한 것이 (2,3,4번과정)이 맞나요?활용 강의에서는 (2,3,4,5번과정)이 맞나요? 근데 BasicErrorController로 재요청하는 방식은 몇 번에서 일어나는건가요? 이전 강의 코드package hello.exception.resolver; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; @Slf4j public class MyHandlerExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { try { if (ex instanceof IllegalArgumentException) { log.info("IllegalArgumentException resolver to 400"); response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage()); return new ModelAndView(); } } catch (Exception e) { log.error("resolver ex", e); } return null; } } 현재 강의 코드package hello.exception.resolver; import com.fasterxml.jackson.databind.ObjectMapper; import hello.exception.exception.UserException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import java.util.HashMap; import java.util.Map; @Slf4j public 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/400"); } } } catch (Exception e) { log.error("resolver ex", e); } return null; } } 3. 모델과 뷰를 반환한다고 하셨는데 모델을 반환할려면 모델에 저장할려는 코드가 필요할 텐데요. setattribute처럼요. 그런 코드가 없어서요..
-
미해결스프링 핵심 원리 - 기본편
초기화 관련 질문
강의 자료 중 초기화에 대한 언급이 나와서 완벽한 감이 안잡혀서 질문을 드립니다.강의 영상 중 초기화는 객체가 일을 시작하는 것이라고 하셨는데 이 일을 시작한다는 말이 정확하게 와닫지 않아서 질문을 드립니다,, 감사합니다..
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
Rest 예외 처리 - RestAuthenticationEntryPoint / RestAccessDeniedHandler 스프링빈 등록 질문
안녕하세요 선생님 Rest 예외처리 편에서 선생님께서는 RestAuthenticationEntryPoint 와 RestAccessDeniedHandler을 따로 스프링 빈으로 등록하지 않고 객체를 생성하는식으로 하셨는데 제가 따로 스프링빈으로 등록하고 해도 잘 동작하던대 따로 빈으로 등록하지 않고 하신 이유가있을까요?해당 코드는 제가 빈으로 따로 등록하고 테스트 했던 코드입니다.
-
미해결견고한 결제 시스템 구축
@WebAdapter 어노테이션에 @Compnent를 다는 이유
@Target(AnnotationTarget.CLASS) @Component annotation class WebAdapter()PaymentController에 @Controller 안에는 @Component가 존재하는데 왜 WebAdapter 어노테이션 클래스에도 @Component를 다는지 궁금합니다!
-
미해결
Access Token과 Refresh Token을 어디에 저장해야 할까요?
현재 프로젝트를 진행중인데, Access Token과 Refresh Token을 헤더에 담아 로컬스토리지에 저장하는 방법을 사용중입니다. 그런데 로컬 스토리지는 보안에 취약하다는 글을 보았습니다. 로컬 스토리지에 담아도 jwt 정책으로 대응이 가능하다는 글도 있었습니다. Access Token과 Refresh Token을 어디에 저장해야 할까요? 만약 로컬 스토리지나 쿠키에 저장한다면 어떻게 관리해야하나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
./gradlew build 후 에러가 났습니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]이렇게 에러가 났는데, 초심자라 전혀 해석을 못하겠습니다.JDK17, Gradle8.7, SpringBoot 3.1.11 로 실행하고 있습니다. 처음 JAVA8을 사용하고 있다가, springboot가 3.0만이 지원되고 있다고 하여, JAVA17을 설치하여 환경변수 등 모두 잘 설정하였습니다. 이외에 수강 내용대로 잘 따라가서, 인텔리제이에서 실행할 때에는 잘 되고 있었는데, wsl에서 build를 하니 에러가 났네요. 어떤 점이 잘못된 걸까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
양방향 연관관계 메서드에서 순서
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 강사님 덕분에 JPA를 이해하며 공부중입니다. 항상 양질의 강의와 사례를 들어 설명해주셔서 감사합니다. 다름이 아니라 제가 양방향 연관관계에 있어 이해한것이 맞는지, 그리고 연관관계 메서드 설정 시 코드원리에 있어 궁금한 점이 있어 질문남깁니다.<이해한 내용>양방향 연관관계는 RDBMS에서는 표현가능하나, 자바 객체에서는 직접적으로 표현이 어려워 단방향 2개를 사용하여 표현한다.그렇기에 서로를 참조하는 형태이기 때문에 데이터 변경을 양쪽에서하면 무한루프, 데이터 불일치,성능 문제가 발생한다.그렇기에 연관관계의 주인(테이블에서의 N)으로 설정해주어 주인에서만 데이터 반영이가능하고 다른 1쪽에서는 mappedBy를 이용해 읽기 전용으로만 설정하여준다. 그렇기에 member.setTeam(team);연관관계 편의 메서드를 통해 참조를 넣어주고, 영속성에 의해 관리되는 즉 1차 캐시에서의 객체내에서 조회될 수 있도록 한다.(객체지향적임) 물론 em.flush();em.clear();를 사용하면 자바에서 우리가만든 객체가아닌 JPA에서의 객체를 반환하여 조회되서 상관없긴하다. 근데 넣어주자.연관관계 편의메서드는 비즈니스 로직상 컨트롤하는 부분이 많은쪽에 만드는것이 좋다.<질문>이 연관관계 메서드에서는 orderItem내의 order가 주입되지않은상태로 List에 저장된 후 order를 주입해주는데 결과는 똑같은것같은데위와같이 주입시켜주고 그것을 List에 저장시키는게 더 좋은것아닌지 궁금해서 질문드립니다. 어차피 조회할때는 Order객체를 통하기때문에 순서는 상관이없나요? 사소한것일수도있고 제 자바에 대한 부족함이 커서그런것같지만 너무 궁금해서 질문드립니다.. 장문이라 죄송합니다ㅜㅜ
-
미해결[아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!
직렬화, 역직렬화 관련
안녕하세요. 좋은 강의 감사합니다.직렬화, 역직렬화 관련해서 질문이 있습니다.저는 Spring 프레임워크를 사용해서 프로듀서와, 컨슈머를 각각 따로 서버를 만들어서 개발 하고 있습니다.수업 내용은 단순히 String이지만 제가 실무에 사용하려고하는건 웹 애플리케이션 과 같이 DTO 클래스로받은 데이터를 그대로 프로듀서에서 send()에 담아서 보내고 있습니다. 컨슈머에서 DTO로 받으려고관련 자료를 찾아 보니 JsonSerializer가 있어 해보았습니다. Object 로 받아서 여러 DTO를 받을 수 있는Consumer factory를 만들다 보니 여러 에러가 발생해서 ObjectMapper를 사용했습니다.@Component public class ObjectMapperService { private final ObjectMapper objectMapper = new ObjectMapper(); public <T> T convertValue(String json, Class<T> valueType) throws JsonProcessingException { return objectMapper.readValue(json, valueType); } }@Component @Slf4j @Data @RequiredArgsConstructor public class KafkaConsumer { private final ObjectMapperService mapper; @KafkaListener(topics = "member-join", containerFactory = "commonKafkaListenerContainerFactory") public void receiveMemberJoin(ConsumerRecord<String, String> consumerRecord, Acknowledgment acknowledgment) throws Exception { String value = consumerRecord.value(); MemberJoin memberJoin = mapper.convertValue(value, MemberJoin.class); String recommendCode = memberJoin.getRecommendCode(); log.info("recommendCode: {}", recommendCode); log.info("received payload = {}", memberJoin.toString()); acknowledgment.acknowledge(); } }이런식으로 사용해서 DTO클래스로 사용했는데 실무에서는 어떤식으로 하는지 궁금합니다. 혹시 참고할 수 있는 정보가 있을까요?감사합니다.