묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
model.addAttribure 에러 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.스프링 입문 2번째 강의 view 환경설정 수강중인데 다음과 같이 에러가 납니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
데이터 접근 예외 직접만들기 코드 질문있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. public void create(String memberId){ try{ repository.save(new Member(memberId,0)); log.info("saveId = {}",memberId); }catch(MyDuplicateKeyException e){ log.info("키 중복, 복구 시도"); String retryId = generateNewId(memberId); log.info("retryId = {}",retryId); repository.save(new Member(retryId,0)); }catch(MyDbException e){ log.info("데이터 접근 계층 예외",e); throw e; } } private String generateNewId(String memberId){ return memberId + new Random().nextInt(10000); }현재 이런식으로 중복된 Id가 있다면 그 뒤에 랜덤한 숫자를 덧붙여서 새로운 Id를 만들어서 재시도 하는것으로 이해했습니다.사실 완전 중복되는것을 막으려면 실제로는 UUID같은것을 생성하면 된다고 생각하지만..이 문제의 경우에서, 새롭게 만든 Id마저도 중복이 되면 오류가 나는것을 확인했습니다.만약 예외가 발생해서 해당 예외를 복구하기위해 재시도를 했으나 그것마저도 실패하는 경우에는 catch구문안에서 또 try~catch를 해야하는건가요?.. 어떤 방법이 있는지 궁금합니다.읽어 주셔서 감사합니다
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
정상처리 예외반환
테스트코드에서 정상처리 되었을때 예외를 반환하는데이 예외는 service에있는 로직을 호출하면 잔고부족 때문에 메서드 자체에서 예외를 던진 것으로 알고있습니다.근데 만약 테스트에서 테스트 코드가 아니라 진짜 사용을 하는 사용자라면 이 던진 예외는 어떻게 처리가 되는것인가요 ??그리고 왜 정상로직에서는 예외를 던지고 잔고부족로직에서는 잡는지 궁금합니다. 정상로직에서는 잡으면 안되는 것인가요 ?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
if 구문에서 return 사용과 관련한 질문입니다.
강의 17:18 쯤에 나오는@Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("FrontControllerServletV1.service"); // / front-controller/v1/members String requestURI = request.getRequestURI(); ControllerV1 controller = controllerMap.get(requestURI); if (controller == null) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); // 404 return; } controller.process(request, response); }이 코드에서 if 구문 내부에 return만 사용하셔서 탈출하도록 하신거같은데 return response.setStatus(HttpServletResponse.SC_NOT_FOUND); 라고 표현해도 상관없을까요?=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
뷰를 찾을때
@RequestMapping("/response-view-v2") public String responseViewV2(Model model) { model.addAttribute("data", "hello"); return "response/hello"; } response/hello 를 찾을 때, 정적 리소스에서 먼저 찾은다음 없으면, 동적에서 찾는걸로 순서가 정해져 있나요? 아니면 response/hello 가 정적인지 동적인지 판별하고 정적 또는 동적 리소스 폴더 아래에서만 찾는건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
소스코드 받을 수 있나요
자바강의처럼 소스코드 받아보고 싶은데 혹시 업데이트 해 주실 수 있으신가요? 만약 안된다면 이유가 뭘까요
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
db, jdbc, jpa 등 관계 정리 문의
현재 트랜잭션관하여 강의를 듣고있는 중입니다. jdbc 트랜잭션 코드랑 jpa 트랜잭션 코드랑 다르다고 하셨는데 이 부분에서 관계정리가 안되거 같아 질문드립니다.위의 사진처럼 이해하면 되나요?? jpa에서 자체적으로 데이터소스를 관리하는지 jdbc 트랜잭션 코드라고 설명을 해주셨는데 여기서 jdbc가 의미하는게 데이터소스 코드를 의미하는지 위의 두개의 질문도 궁금합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
핸들러 조회할 때
이전 강의까지 다수의 @Controller가 존재했는데, 요청된 url로 가장 먼저 RequestMappingHandlerMapping이 등록된 url을 찾는 방법이 어떻게 되나요? @RequestMapping(url)도 빈으로 등록되어서 찾는건가요? 아니면 모든 @Controller 빈 을 무작위로 조회하고 그 안의 요청과 맞는 @RequestMapping(url)을 찾으면 그 @Controller의 클래스를 handler로 매핑하는 방식인가요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
의존관계주입
공부를하다가 제대로 이해하고있는건지 확인하고싶어 질문드립니다!JDBC템플릿도 그렇고JPA에서 의존관계주입시, 리포지토리안에서 JPAQueryFactory를 생성해 엔티티매니저를 주입받아 사용합니다.지금은 config에서 의존관계설정을 다하는데 이걸 스프링부트가 해주게되면 스프링컨테이너에 올라가있는 리포지토리,서비스,컨트롤러를보고 적절하게 생성자 파라미터에있는 이 엔티티매니저를 생성해 주입해주는것인가요??
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
HashMap을 사용한 MemoryItemRepository에서 순서 보장 문제와 테스트 실패 가능성 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요, "프로젝트 구조 설명3 - 테스트" 강의에서 ItemRepositoryTest 클래스안에 코드라인 88번 test(String itemName, Integer maxPrice, Item... items) 함수에서 사용되어진 containsExactly 함수는 참이기 위해서 모든 값이 같아하고 그리고 주어진 값들의 순서역시 같아야 한다고 이해를 하였습니다. 근데 여기에서 궁금한점이 MemoryItemRepository에서 HashMap을 사용한 경우 입력되어진 값들의 순서가 보장되어 지지 않아서 어떠한 경우에는 테스트 findItems이 값들의 순서가 일치하지 않아서 실패하는 것이 아닌가에 대해서 궁금증이 생기어서 질문을 남깁니다. 감사합니다 :)
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
JDBC 질문 드립니다.
안녕하세요. 현재 9강까지 강의를 들은 상태입니다.다름이아니라, 현재 9강까지는 JDBC를 사용하는 부분을 학습하고 있는데요. 여기서 JDBC를 사용한다는게 구체적으로 어떤것을 의미하는지 질문드립니다.JDBC를 사용한다는것이 DriverManager를 사용하는것을 말하는것일가요? 아니면 DriverManager뿐만아니라, Connection, PreparedStatement, ResultSet를 사용하는것을 말하는것일까요? 헷갈려서 질문드립니다..!
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
set autocommit 질문
set autocommit false; 인 상황에서delete from member; 를 수행한 뒤에 commit을 하지 않고, set autocommit true; 를 해보았습니다.그랬더니, db에 데이터가 없는 것을 확인했습니다. 혹시 set autocommit true; 명령어를 수행시키는 순간 commit이 한번 자동으로 실행되는 것일까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
HTTP API
1.HTTP API 방식은 보통 CSR로 다 처리 하나요? 백엔드에서는 데이터 주는것 까지만 신경쓰면되나요? 그럼 실제로 프론트 없이 토이 프로젝트 할때는 아래 2번을 통해서만 진행하면되나요? 정적이거나 , html form형태로 할때는 CSR이 필요없는건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링 데이터 jpa 통합테스트 오류
스프링 데이터 jpa의 통합테스트 - 회원가입 부분을 돌리는 부분에서 private final MemberRepository memberRepository;이 부분에서 자동 주입을 할 수 없습니다. 'MemberRepository' 타입의 bean이 두 개 이상 있습니다.라는 오류가 떠 memorymemberrepository에 쓰인 @Repository를 지워 private final MemberRepository memberRepository;이 부분의 빨간 줄은 없앴는데 테스트는 안 돌아가서 질문 남깁니다무슨 오류일까요? 해결방법도 알려주세요,,SpringConfig MemberServiceIntegrationTestSpringDataJpaMemberRepsitory아래는 테스트 실행시 나오는 에러 메시지입니다java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.sql.SQLException, String)" because the return value of "org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.sqlExceptionHelper()" is null at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:116) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.boot.model.relational.Database.<init>(Database.java:45) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:189) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]2024-06-21T18:39:08.309+09:00 ERROR 43820 --- [hello-spring] [ Test worker] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)2024-06-21T18:39:08.310+09:00 WARN 43820 --- [hello-spring] [ Test worker] o.s.w.c.s.GenericWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)2024-06-21T18:39:08.324+09:00 INFO 43820 --- [hello-spring] [ Test worker] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.2024-06-21T18:39:08.339+09:00 ERROR 43820 --- [hello-spring] [ Test worker] o.s.boot.SpringApplication : Application run failed
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링 3.3.1 버전에서 생성자 함수 (new Member(username,age)) 의 값이 null 과 0으로 나오는데
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]스프링 3.3.1 버전에서 생성자 함수 (new Member(username,age)) 의 값이 null 과 0으로 나오는데 혹시 원인을 알 수 있을까요 builder 패턴으로 작성한건 값이 잘 나옵니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
h2 버전 질문드립니다...
안녕하세요.강의에서 말씀하시기를 인텔리제이 내 라이브러리에 명시되어있는 h2의 버전을 다운로드 받으라고 말씀하셨고, 강의 자료에서는 스프링부트 2.x를 사용하면 1.4.200버전을 다운로드해야되고, 스프링부트 3.x를 사용하면 2.1.214버전을 다운로드 해야된다고 말씀하셨는데요. 제 인텔리제이 프로젝트의 gradle 및 라이브러리를 보면 스프링부트의 버전은 2.7.14이고, h2의 버전은 2.1.214라고 나와있습니다.이럴때에는 h2의 어떤 버전을 다운로드 해야되는지 질문드립니다.. 현재 저의 스프링부트의 버전이 2.x라서 1.4.200버전을 다운로드해서 진행하고 있었는데 혹시 추후에 문제가 될게 있을까봐 질문드립니다.. h2의 어떤 버전을 다운로드 해야될까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션 7. post
<form action="item.html" th:action method="post"> <div> <label for="itemName">상품명</label> <input type="text" id="itemName" name="itemName" class="formcontrol" placeholder="이름을 입력하세요"> </div> <div> <label for="price">가격</label> <input type="text" id="price" name="price" class="form-control" placeholder="가격을 입력하세요"> </div> <div> <label for="quantity">수량</label> <input type="text" id="quantity" name="quantity" class="formcontrol" placeholder="수량을 입력하세요"> </div> <hr class="my-4"> <div class="row"> <div class="col"> <button class="w-100 btn btn-primary btn-lg" type="submit">상품 등 록</button> </div> <div class="col"> <button class="w-100 btn btn-secondary btn-lg" onclick="location.href='items.html'" th:onclick="|location.href='@{/basic/items}'|" type="button">취소</button> </div> </div> </form>여기서 method="post"인데 html 폼 데이터로 전송된다고 교재에 적혀있는데, 요청 데이터 전송에는Get 파라미터html 데이터 폼 전송http api 형식 데이터 전송3가지중 Post이기에 Get은 아니지만, 왜 미디어 타입에 관한 건 명시되어 있지않은데, 왜 무조건 html 폼 데이터로 전송 되는 건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
2강 - Http 응답 데이터 - Html 질문
html 응답에 <head>태그가 없는 이유가 response 객체에 contentType이랑 encoding 형식을 지정해줘서 그런 것 맞나요 ? package hello.servlet.basic.response; ** import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet(name = "responseHtmlServlet", urlPatterns = "/response-html") public class ResponseHtmlServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Content-Type: text/html;charset=utf-8 response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); PrintWriter writer = response.getWriter(); writer.println("<html>"); writer.println("<body>"); writer.println(" <div>안녕?</div>"); writer.println("</body>"); writer.println("</html>"); } }
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@ServletComponentScan 작성 후 오류를 해결했는데 이유를 알고싶습니다.
@ServletComponentScan 작성, HelloServlet 클래스까지 모두 작성 후 실행 -> 오류발생커뮤니티 글들에서 같은 오류와 해결방안을 바탕으로 해결완료.build.gradle 에서 providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' 을 삭제하니정상 작동하였습니다.1.providedRuntime을 삭제하고 작동한 이유가 무엇인가요? 하지만 localhost 실행하니 servlet은 잘 생성된 것 같은데 페이지는 여전히 오류화면이 뜹니다.2024-06-20T10:54:52.014+09:00 INFO 34832 --- [servlet] [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'2024-06-20T10:54:52.014+09:00 INFO 34832 --- [servlet] [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'2024-06-20T10:54:52.015+09:00 INFO 34832 --- [servlet] [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms 2. 서블릿이 잘 생성됐는데 페이지는 왜 오류뜨나요? jdk17 , 스프링부트 3.3.0
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션 7. 질문
상품 등록을 누르면localhost:8080/basic/items/add로 이동합니다. 그러면 상품 등록 폼이 보입니다.코드로 보면 /basic/addForm을 열었습니다.@GetMapping("/add") public String addForm() { return "/basic/addForm"; } 상품 등록 폼에서 상품을 등록합니다. 상품을 등록하면 /basic/item을 보여주게 됩니다.그런데 url을 보면 localhost:8080/basic/items/5 이렇습니다. @PostMapping("/add") public String addItemV3(@ModelAttribute Item item) { itemRepository.save(item); return "/basic/item"; }왜 items인 건지 이해가 가지 않습니다. 주소에 /basic/item으로 찍혀야 하는 거 아닌가요?