inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

실전문제 해설 pdf 파일

미해결

AWS Certified Solutions Architect - Associate 자격증 준비하기

안녕하세요 강사님, 실전문제풀이 해설 pdf 받을 수 있는지 문의 드립니다! 이메일 : kbm17@naver.com 감사합니다.

  • 네트워크
  • aws
12ganzi 댓글 1 좋아요 0 조회수 245

생성자가 하나인경우 자동으로 스프링 bin 등록?

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

스프링 JdbcTemplate 강의 2분 17초 내용 관련하여 질문이 있습니다. 생성자가 딱 하나 있으면 자동으로 스프링 bin 에 등록이 되어서 @autowire를 생략할 수 있다고 하는데, 그럴려면 관리하고 싶은 객체 클래스에 @Controller, @service, @Repository 혹은 자바로 등록하는 방법인 @Configuration 과 @bean 이 필요하잖아요 하지만 2분 17초 화면에서는 위와 같은 애노테이션을 찾아 볼 수 없고, 상속받은 MemberRepostiory 가 자바로 빈에 등록 되어있는 것을 볼 수 있습니다. 내가 스프링 bin에 등록하여 관리하고 싶은 객체가 클래스위에 직접 선언 혹은 implements 로 상속받은 클래스가 bin으로 등록 되어 있다면 위의 경우 모두 똑같이 생성자가 딱 하나 있다면, @autowire를 생략할 수 있다고 생각하면 되는지 궁금합니다. 만약 틀리다면 아닌 이유에 설명 부탁드립니다. 또한 @Override 를 붙이는 이유에 대해서도 설명 부탁드립니다.

  • java
  • spring
  • mvc
  • spring-boot
김지수 댓글 1 좋아요 0 조회수 517

제로초님 안녕하세요!! setInterval clearInterval 실행위치 부탁드립니다.

해결됨

웹 게임을 만들며 배우는 React

제로초님 안녕하세요!! setInterval clearInterval 실행위치 부탁드립니다. import { useRef, useEffect } from 'react'; function useInterval(callback, delay) { const savedCallback = useRef(); useEffect(() => { savedCallback.current = callback; }); useEffect(() => { function tick() { savedCallback.current(); } if (delay !== null) { let id = setInterval(tick, delay); return () => clearInterval(id); 요부분!! } }, [delay]); return savedCallback.current; } export default useInterval; 질문1. if문에서 return에 단지 익명함수를 작성하고 그 익명함수의 return으로 clearInterval 을 적어준건데 왜 익명함수가 실행되어 clearInterval이 등록이되는건가요?? if의 함수의 리턴값이 익명함수의 주소아닌가요? 질문2. if에서 reutnrn에 익명함수가 실행되었고 clearinterval이 등록되었다고 치면 왜 delay가 빠꼈을때 실행되는거에요?? ㅠㅠ부탁드립니다. 이해하고싶어요 4시간째 구글링하고 찾아봐도 이해가안되네요.. 다른분답변에서 setInterval 500으로 실행되면서 return쪽 clearInterval 코드도 등록됩니다. 이 부분도 왜 등록이 되는건가요?ㅠ

  • react
gxpk0721 댓글 1 좋아요 1 조회수 712

검색 기능 sql인젝션 질문이 있습니다.

해결됨

모의해킹 실무자가 알려주는, SQL Injection 공격 기법과 시큐어 코딩 : PART 1

안녕하세요. 강의해주셔서 감사합니다. 가끔씩 연습을 하다보면 % 만 입력했을 시 전체데이터가 뱉어지는 경우가 있는데, 배운대로, SELECT * FROM board WHERE title like '%검색어%' 라면 SELECT * FROM board WHERE title like '%%%'가 될 것 같습니다. 이게 어떤 원리로 전체 데이터가 출력이 되는 건지 궁금합니다. 입력한 %가 메타문자(와일드카드)로 인식되어 전체출력이 되는 걸까요? 그리고 싱글쿼터만 넣어도 전체 데이터가 출력되는 경우도 있던데 이것도 어떤 원리인지 너무 궁금합니다...! 알려주시면 감사하겠습니다.

  • 모의해킹
  • 인젝션
아니 댓글 1 좋아요 2 조회수 724

THIS!

해결됨

토비의 스프링 부트 - 이해와 원리

안녕하세요, 자바 기본 적인 질문 한가지만 드릴게요...! public class HellobootApplication { public static void main(String[] args) { GenericWebApplicationContext applicationContext = new GenericWebApplicationContext() { @Override protected void onRefresh() { super.onRefresh(); ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory(); WebServer webServer = serverFactory.getWebServer(servletContext -> { servletContext.addServlet("dispatcherServlet", new DispatcherServlet(this)) .addMapping("/*"); }); webServer.start(); } }; applicationContext.registerBean(HelloController.class); applicationContext.registerBean(SimpleHelloService.class); applicationContext.refresh(); } } 여기서 this는 HellobootApplication class가 아닌, applicationContext 를 지칭 하는게 맞을까요..? 매번 this가 조금씩 헷갈리네요 ,,,, 이상한 질문 죄송합니다....!

  • spring
  • spring-boot
  • spring-jdbc
송재학 댓글 1 좋아요 1 조회수 516

선생님 UDP 관련 질문입니다.

해결됨

외워서 끝내는 네트워크 핵심이론 - 기초

혼자서 공부를 하다보니 UDP를 사용하는 예시로서 DNS에 질의를 보내는것 있다는 것을 알게되었습니다. 혹시 DNS에 UDP를 사용하는 이유에 대해서 알려주실 수 있으실까요?

  • 네트워크
  • 프로토콜
홍창섭 댓글 1 좋아요 0 조회수 324

자동주입이 안되고 있습니다. ㅠㅠ

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) 주입이 안되고 있는데 왜그런지 모르겠습니다 ㅠㅠ

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
현 명 댓글 1 좋아요 1 조회수 443

문의

미해결

HTML+CSS+JS 포트폴리오 실전 퍼블리싱(시즌1)

<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title> 도형 로딩 애니메이션-01 </title> <link rel="stylesheet" href="style.css"> </head> <body> <div class="loading"> <span></span> <span></span> <span></span> </div> </body> </html> @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100&display=swap'); body { font-family: 'Noto Sans KR', sans-serif; line-height: 1.5em; margin: 0; font-weight: 300; display: flex; justify-content: center; align-items: center; height: 100vh; } a { text-decoration: none; } .loading {} .loading span { display: inline-block; width: 15px; height: 15px; background-color: gray; background-repeat: 50%; } .loading span:nth-child(1) {} .loading span:nth-child(2) {} .loading span:nth-child(3) {} @keyframes loading { 0% { opacity: 0; transform: scale(0.5); } 50% { opacity: 0; transform: scale(1.2); } 100% { opacity: 0; transform: scale(0.5); } } 도형 자체가 만들어지지 않는데 뭐가 문제일까요? VS CODE 사용중입니다.

  • HTML/CSS
  • jquery
닉네임12 댓글 2 좋아요 1 조회수 467

hibernate 프로젝트 생성 관련 문의

미해결

기존 강의에서는 Maven프로젝트로 hibernate 5.3.10 버전으로 프로젝트 생성이 되어 있습니다 저는 java 17버전으로 gradle 프로젝트로 생성하고 spring-boot 3.0.4 버전으로 잡고 강의를 수강을 할려고 합니다 해당 URL에서 https://docs.spring.io/spring-boot/docs/3.0.4/reference/htmlsingle/#appendix.dependency-versions.coordinates hibernate-core 버전을 확인 하여 hibernate 6.1.7 https://hibernate.org/orm/documentation/getting-started/ build.gradle plugins { id 'java' } group 'com.lee.test' version '1.0.0' repositories { mavenCentral() } dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' implementation 'org.hibernate:hibernate-core:6.1.7.Final' implementation 'com.h2database:h2:2.1.214' } test { useJUnitPlatform() } resources/META-INF/persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"> <persistence-unit name="hello"> <properties> <!-- 필수 속성 --> <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/> <property name="jakarta.persistence.jdbc.user" value="sa"/> <property name="jakarta.persistence.jdbc.password" value=""/> <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <!-- 옵션 --> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.use_sql_comments" value="true"/> <property name="hibernate.hbm2ddl.auto" value="create" /> </properties> </persistence-unit> </persistence> Entity Class package hijpa; import jakarta.persistence.Entity; import jakarta.persistence.Id; @Entity public class Member { @Id private Long id; private String name; public Member() {} public Member(Long id, String name) { this.id = id; this.name = name; } } Main Class package hijpa; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.EntityTransaction; import jakarta.persistence.Persistence; public class JPAmain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); Member member = new Member(1L,"hi"); em.persist(member); tx.commit(); em.clear(); emf.close(); } } IDE 설정은 아래와 같습니다 실행결과 "C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2021.3.2\lib\idea_rt.jar=64376:C:\Program Files\JetBrains\IntelliJ IDEA 2021.3.2\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\User\IdeaProjects\stduy\jpa-basic\out\production\classes;C:\Users\User\IdeaProjects\stduy\jpa-basic\out\production\resources;C:\Users\User\.gradle\caches\modules-2\files-2.1\com.h2database\h2\2.1.214\d5c2005c9e3279201e12d4776c948578b16bf8b2\h2-2.1.214.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.hibernate.orm\hibernate-core\6.1.7.Final\343f47b34c96fe9c44bf9b219a7b3c5d6d2fc90e\hibernate-core-6.1.7.Final.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\jakarta.persistence\jakarta.persistence-api\3.0.0\affc7884a85b6876d438a88b5d21ea29b1cc2dd8\jakarta.persistence-api-3.0.0.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\jakarta.transaction\jakarta.transaction-api\2.0.0\24a0525b4acfbca4086d2f1278be3a084fe1c67d\jakarta.transaction-api-2.0.0.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.jboss.logging\jboss-logging\3.4.3.Final\c4bd7e12a745c0e7f6cf98c45cdcdf482fd827ea\jboss-logging-3.4.3.Final.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.hibernate.common\hibernate-commons-annotations\6.0.6.Final\77a5f94b56d49508e0ee334751db5b78e5ccd50c\hibernate-commons-annotations-6.0.6.Final.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.jboss\jandex\2.4.2.Final\1e1c385990b258ff1a24c801e84aebbacf70eb39\jandex-2.4.2.Final.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\com.fasterxml\classmate\1.5.1\3fe0bed568c62df5e89f4f174c101eab25345b6c\classmate-1.5.1.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy\1.12.18\875a9c3f29d2f6f499dfd60d76e97a343f9b1233\byte-buddy-1.12.18.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.glassfish.jaxb\jaxb-runtime\3.0.2\9897322f5de201bfbfcd1f4f46ffdd4204673b3c\jaxb-runtime-3.0.2.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\jakarta.xml.bind\jakarta.xml.bind-api\3.0.1\5257932df36ff3e4e6de50429dde946490a6a800\jakarta.xml.bind-api-3.0.1.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\jakarta.inject\jakarta.inject-api\2.0.0\46fc8560b6fd17b78396d88f39c1a730457671f0\jakarta.inject-api-2.0.0.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.antlr\antlr4-runtime\4.10.1\10839f875928f59c622d675091d51a43ea0dc5f7\antlr4-runtime-4.10.1.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.glassfish.jaxb\jaxb-core\3.0.2\e83d0b0005525ddd8b8642bd0bb02227fcf871f1\jaxb-core-3.0.2.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\com.sun.activation\jakarta.activation\2.0.1\828b80e886a52bb09fe41ff410b10b342f533ce1\jakarta.activation-2.0.1.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.glassfish.jaxb\txw2\3.0.2\8c448a44cdcdbb5dd48ff2eb88cab858ed52cf91\txw2-3.0.2.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\com.sun.istack\istack-commons-runtime\4.0.1\4e25c41d338aad4a2c92d0020c9ae0335fad5099\istack-commons-runtime-4.0.1.jar hijpa.JPAmain 3월 14, 2023 9:18:28 오후 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation INFO: HHH000204: Processing PersistenceUnitInfo [name: hello] 3월 14, 2023 9:18:28 오후 org.hibernate.Version logVersion INFO: HHH000412: Hibernate ORM core version 6.1.7.Final 3월 14, 2023 9:18:29 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure WARN: HHH10001002: Using built-in connection pool (not intended for production use) 3월 14, 2023 9:18:29 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001005: Loaded JDBC driver class: org.h2.Driver 3월 14, 2023 9:18:29 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001012: Connecting with JDBC URL [jdbc:h2:tcp:// localhost/~/test ] 3월 14, 2023 9:18:29 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001001: Connection properties: {password=****, user=sa} 3월 14, 2023 9:18:29 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001003: Autocommit mode: false 3월 14, 2023 9:18:29 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init> INFO: HHH10001115: Connection pool size: 20 (min=1) 3월 14, 2023 9:18:29 오후 org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl logSelectedDialect INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect 3월 14, 2023 9:18:29 오후 org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] Exception in thread "main" java.lang.IllegalArgumentException: Unable to locate persister: hijpa.Member at org.hibernate.internal.SessionImpl.firePersist( SessionImpl.java:740 ) at org.hibernate.internal.SessionImpl.persist( SessionImpl.java:721 ) at hijpa.JPAmain.main( JPAmain.java:17 ) 하루 동안 삽질을 했지만 큰 성과는 없었습니다.... 어떤 부분이 잘못되어 persist부분이 수행이 안되는것일까요 ???

이주형 댓글 1 좋아요 0 조회수 1068

환율 네트워크처리1 질문있습니다.

미해결

성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]

안녕하세요 강의 41:46분에 pickerView 의 delegate중에서 didSelecRow에 관해서 궁금한게있는데 해당 delegate속성이 picker로인해 선택된 row를 반환해준다고 알고있습니다. 궁금한게[ didSeleectRow가있는 delegate메서드를 사용하려면 저는 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { selectedRow = row } 여기 함수안에서 var selectedRow = 0 { didSet { selectedCurrencyName.text = rates?[selectedRow].0 selectedCurrency.text = calculateCurrency() } } 위에 해당하는 코드를 작성해야 함수가 작동된다고 생각했는데 강사님 강의보니 그게아니더라구요 왜 그런건가요? 가만생각해보니 didSelecRow에서 현재 선택된 row정보만 얻기위한 용도로 pickerView didSelectRow 델리게이트 메서드를 이용했고 row정보를 얻었으니 화면에 뿌려주는 역활은 굳이 안해도되기떄문에 위의코드처럼 따로 didSet속성을 이용해서 화면을 나타낸걸로 이해했는데 제가 이해한게 맞을까요?

  • ios
  • swift
  • 동시성
수열임 댓글 1 좋아요 0 조회수 294

알고리즘 교안 33p 질문

미해결

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

알고리즘 교안 33p a.find("love") 부분에 대한 이해가 맞는지 질문드립니다. it = a.find("love") 에서 it 값이 love가 있다라고 결정되면 it != string::npos -> string::npos(string이 없다)와 값이 같지 않아서 있다고 인정된다 맞을까요? C언어에 대한 기초 강의를 듣고 시작해도 조금 버겁네요ㅜㅜ

  • c++
  • 코딩-테스트
우현 댓글 2 좋아요 1 조회수 683

3-B 시간 복잡도..!

해결됨

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

#include <bits/stdc++.h> using namespace std; int N, M, res; int vis[54][54]; char bd[54][54]; string s; vector<pair<int,int>> land; vector<int> select_land; int dy[4] = {0, -1, 0, 1}; int dx[4] = {1, 0, -1, 0}; void bfs(){ pair<int,int> st = land[select_land[0]]; // land pair<int, int> ed = land[select_land[1]]; // land queue<pair<int,int>> Q; Q.push({st.first, st.second}); // Q삽입 vis[st.first][st.second] = 1; // 방문표시 while(!Q.empty()){ pair<int, int> cur = Q.front(); Q.pop(); for(int dir = 0 ; dir < 4 ; dir++){ int ny = cur.first + dy[dir]; int nx = cur.second + dx[dir]; if(ny==ed.first && nx==ed.second) { vis[ny][nx] = vis[cur.first][cur.second] + 1; res = max(res, vis[ny][nx]); return; // 도착하면 종료 } if(ny >= N || nx >= M || ny < 0 || nx < 0) continue; if(bd[ny][nx]=='W' || vis[ny][nx]!=0) continue; // 방문했거나 물이면 pass Q.push({ny, nx}); vis[ny][nx] = vis[cur.first][cur.second] + 1; } } // 도착하지 못했다면, 그냥 for문을 빠져나옴. (res 업데이트 필요 X) } void solve(int n){ if(select_land.size()==2){ // 2개를 고름. bfs(); fill(&vis[0][0], &vis[0][0] + 54*54, 0); // vis배열 초기화 return; } for(int i = n+1 ; i < land.size() ; i++){ // 땅 전체 개수 (0번부터 land.size()-1번까지) select_land.push_back(i); // 01, 02, 03 ..... solve(i); select_land.pop_back(); } return; } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N >> M; for(int i = 0 ; i < N ; i++){ cin >> s; for(int j = 0 ; j < M ; j++){ bd[i][j] = s[j]; if(s[j]=='L') land.push_back({i,j}); } } // 입력 받기 solve(-1); cout << res-1; } 저는 랜드를 모두 구해서 랜드 중에 2개를 뽑고, 최단거리를 구하고 최단거리중 최대값을 뽑는 로직으로 구해봤습니다. 그런데 시간복잡도에서 계속 걸리네요 ㅠㅠ 혹시 크기가 50*50이라 재귀적으로 하려했는데 이 코드는 시간복잡도가 어떻게 되나요 ㅠㅠ

  • c++
  • 코딩-테스트
정태승 댓글 1 좋아요 1 조회수 303

포인터 실습 강의 질문합니다.

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

포인터 실습 강의를 다 보고 연습할 겸 플레이어를 만들고 플레이어가 레벨업을 할 경우 영구적으로 스탯이 증가하는 것을 만드려고 하는데 생각대로 안되더군요.. 포인터만 사용해서는 만들 수 없는 건가요? struct statinfo { int hp; int atk; int def; }; void player(statinfo* playerinfo) { playerinfo->hp = 300; playerinfo->atk = 30; playerinfo->def = 20; } int playerup(statinfo* abc) { int up = (abc->hp) + 12; cout << up << endl; return up; } int main() { statinfo playerstat; statinfo* playerstatPTR = &playerstat; player(&playerstat); cout << playerstat.hp << endl; cout << playerstatPTR->hp << endl; playerup(&playerstat); }

  • c++
rl12694 댓글 1 좋아요 0 조회수 433

<html lang = "ko">

미해결

입문자를 위한, HTML&CSS 웹 개발 입문

"ko"를 "en"으로 바꾸면 영어로 컨텐츠 내용을 구성할 수 있다고 하셨는데 혹시 한글, 영어를 섞어서 넣고 싶으면 어떻게 작성해야 할까요?

  • HTML/CSS
태보미 댓글 1 좋아요 0 조회수 852

상품 수정시 유효성 검사

해결됨

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

상품 수정 기능 구현중에 수정내역의 유효성 검사를 추가해보고 싶어서 코드를 추가했습니다. ```java``` package jpabook.jpashopre.controller; import lombok.Getter; import lombok.Setter; import javax.validation.constraints.NotEmpty; @Getter @Setter public class BookForm { private Long id; @NotEmpty(message = "이름은 필수 입력 사항입니다.") private String name; private int price; private int stockQuantity; @NotEmpty(message = "작가은 필수 입력 사항입니다.") private String author; private String isbn; } package jpabook.jpashopre.controller; import jpabook.jpashopre.domain.item.Book; import jpabook.jpashopre.domain.item.Item; import jpabook.jpashopre.service.ItemService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; @Controller @RequiredArgsConstructor @Slf4j public class itemController { private final ItemService itemService; @GetMapping("/items/new") public String createForm(Model model) { model.addAttribute("form", new BookForm()); return "item/createItemForm"; } @PostMapping("/items/new") public String create(@Valid @ModelAttribute("form") BookForm form, BindingResult result) { if(result.hasErrors()){ return "item/createItemForm"; } Book item = new Book(); item.setName(form.getName()); item.setPrice(form.getPrice()); item.setStockQuantity(form.getStockQuantity()); item.setAuthor(form.getAuthor()); item.setIsbn(form.getIsbn()); itemService.saveItem(item); return "redirect:/"; } @GetMapping("/items") public String list(Model model) { List<Item> items = itemService.findItems(); model.addAttribute("items", items); return "item/itemList"; } @GetMapping("/items/{itemId}/edit") public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) { Book item = (Book) itemService.findOne(itemId); BookForm form = new BookForm(); form.setId(item.getId()); form.setName(item.getName()); form.setPrice(item.getPrice()); form.setStockQuantity(item.getStockQuantity()); form.setAuthor(item.getAuthor()); form.setIsbn(item.getIsbn()); model.addAttribute("form", form); return "item/updateItemForm"; } @PostMapping("/items/{itemId}/edit") public String updateItem(@ModelAttribute("form") @Valid BookForm form,@PathVariable("itemId")Long itemId, BindingResult result) { if (result.hasErrors()) { return "item/updateItemForm"; } itemService.updateItem(form.getId(), form.getName(), form.getPrice(), form.getStockQuantity(), form.getAuthor(), form.getIsbn()); return "redirect:/items"; } } <!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head th:replace="fragments/header :: header" /> <style> .fieldError { border-color: #bd2130; } </style> <body> <div class="container"> <div th:replace="fragments/bodyHeader :: bodyHeader"/> <form th:object="${form}" method="post"> <!-- id --> <input type="hidden" th:field="*{id}" /> <div class="form-group"> <label th:for="name">상품명</label> <input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요" th:class="${#fields.hasErrors('name')}? 'form-control fieldError' : 'form-control'"> <p th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Incorrect date</p> </div> <div class="form-group"> <label th:for="price">가격</label> <input type="number" th:field="*{price}" class="form-control" placeholder="가격을 입력하세요" /> </div> <div class="form-group"> <label th:for="stockQuantity">수량</label> <input type="number" th:field="*{stockQuantity}" class="form-control" placeholder="수량을 입력하세요" /> </div> <div class="form-group"> <label th:for="author">저자</label> <input type="text" th:field="*{author}" class="form-control" placeholder="저자를 입력하세요" th:class="${#fields.hasErrors('author')}? 'form-control fieldError' : 'form-control'"> <p th:if="${#fields.hasErrors('author')}" th:errors="*{author}">Incorrect date</p> </div> <div class="form-group"> <label th:for="isbn">ISBN</label> <input type="text" th:field="*{isbn}" class="form-control" placeholder="ISBN을 입력하세요" /> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> <div th:replace="fragments/footer :: footer" /> </div> <!-- /container --> </body> </html> 이름을 입력하지 않고 유효성검사를 실시했습니다. 하지만... 네...실패했습니다 네트워크에서도 이름이 빠진채로 의도대로 전달도 되었으나 뷰를 표기하지 못하고 화이트라벨 에러페이지만 나옵니다 ㅠ 콘솔도 의도된 에러메시지가 출력이 됩니다. 뷰단쪽에 문제 일까요? 해결 th:action="@{/items/*{id}/edit}" ->updateItemForm,html에 form에 action으로 해결하였습니다. 화이트라벨 에러페이지가 좀더 상세한 에러메시지를보여줬으면 하는데 어떻게 설정해야 할까요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
하리보 댓글 1 좋아요 0 조회수 593

Projections 질문 dto의 property와 entity의 property의 타입이 다를때 어떻게 변환을 할 수 있나요?

미해결

실전! Querydsl

안녕하세요. 다음과 같이 Entity와 Dto가 LocalDateTime, OffsetDateTime 을 사용하여 데이타 타입이 다릅니다. 이경우에 class EntityA { public Long id public LocalDateTime regDt; } class DtoA { public Long id public OffsetDateTime regDt; } querydsl 문장을 다음과 같이 하면, List<DtoA > list = jpaQueryFactory .select( Projections.fields( DtoA.class, entityA.id, entityA.regDt )) .from(entityA) .fetch() ; 다음과 같이 오류가 발생합니다. java.lang.IllegalArgumentException: java.time.LocalDateTime is not compatible with java.time.OffsetDateTime 다음과 같은 변환함수를 쓰면 될거 같은데, public OffsetDateTime map(Date value) { try{ ZoneOffset zoneOffset = ZoneId.systemDefault().getRules().getOffset(Instant.now()); return value.toInstant().atOffset(zoneOffset); } catch( Exception e) { throw new RuntimeException( e ); } } 이 함수를 querydsl에 어떻게 넣어야 할지 모르겠어요 답변 부탁드립니다. 감사합니다.

  • java
  • jpa
신성철 댓글 1 좋아요 0 조회수 728

강의 자료 요청

미해결

[핵집] 2025 빅데이터 분석기사(필기)_과목 1~2

저도 빅데이터 분석기사 필기 1~2와 3~4 강의를 모두 신청하였습니다. 저도 강의 자료 한꺼번에 받고 싶습니다. alskacjswo@naver.com으로 자료 부탁드립니다. 감사합니다.

  • 빅데이터
alskacjswo 댓글 1 좋아요 0 조회수 272

@ResponseBody 사용 시 html 파일로 리턴됨

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 컨트롤러에서 아래와 같이 작성해서 @ResponseBody @GetMapping("hello-string") public String helloString(@RequestParam("name") String name){ return "helloooooooooo " + name; } http://localhost:8080/hello-string?name=spring 를 호출하면.. 개발자도구를 열었을때 단순 string 이 아니라 text/html 을 반환하는데 왜그런건가요? 브라우져는 크롬 사용하고있습니다. 크롬 개발자도구에서 아래와 같이 보입니다.

  • java
  • spring
  • mvc
  • spring-boot
황연주 댓글 1 좋아요 0 조회수 836

401 오류

미해결

[리뉴얼] React로 NodeBird SNS 만들기

쿠키 세션과 전체 로그인 흐름 강의 까지 들었습니다. 안녕하세요. 로그인시 401 오류가 생겨서 해결을 못하고 있습니다. user saga 에서 logInAPI랑 logIn 부분에서 error가 생기고 있는거 같은데 이유를 찾지 못했습니다. 아래에 비슷한 질문이 있길래 봤더니 json 형식으로 axios.post 해줘야 한다고 하시는 거 같은데 이해를 못하겠습니다... 조금 더 길게 설명해 주실 수 있을까요?

  • react
  • redux
  • node.js
  • express
  • next.js
ea 댓글 1 좋아요 0 조회수 589

인기 태그

인프런 TOP Writers

주간 인기글