묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
{itemId} 매핑원리 질문입니다.
@PostMapping("/{itemId}/edit")public String edit(@PathVariable long itemId,@ModelAttribute Item updateParam) { itemRepository.update(itemId,updateParam); return "redirect:/basic/items/{itemId}"; } 위 코드의 메서드가 실행될 때, {itemId} 에 @PathVariable long itemId 가 매핑되는데 매핑되는 원리가 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션 형태 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 직접 만든 세션에서는 세션id로 UUID를 이용해서 랜덤한 값을 만들어서 세션 보관을 하고 이 세션id를 쿠키의 값으로 전달했는데 HttpSession의 경우는 쿠키가 다음과 같다고 하셨습니다. JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05 그럼 5B78E23B513F50164D6FDD8C97B0AD05 가 톰캣이 만든 세션id인가요? 다른 글에서 세션들을 보관하는 세션 저장소가 하나 더 있다고 봤는데 위에서 랜덤값인 세션 id가 key 이고 value가 Map(편의상 Map2) 인 Map형태의 세션 저장소가 있고 value인 Map2 또한 세션 저장소로 랜덤한 세션id 로 인증된 특정한 사용자만 사용하는건가요? Map2에서 저희가 session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember); 등록한게 있는거 같구요. 만약 제가 생각한게 맞다면 굳이 왜 이런 형태를 이용하나요? 직접 만든 Session 처럼 처음부터 랜덤한 값을 세션 키로 이용하면 Map 하나로 해결될것 같아서요.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
itemRepository.save(item); 부분에서 궁금한 것이 있습니다 !
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 영한님, 서포터즈님! 강의 너무너무 잘 보고있습니다. 다름이 아니라 itemRepository.save(item) 부분에서 궁금한게, 영한님은 따로 Item savedItem 이라는 변수를 만들어서 redirectAttributes.addAttribute("itemId", savedItem.getId()) 이렇게 사용하시는데 저는 굳이 변수를 따로 만드는게 아니라, @ModelAttribute Item item 객체를 가지고 redirectAttributes.addAttribute("itemId", item.getId()); 라고 상용해도 되지 않을까? 라는 궁금증이 생겼습니다. 실행은 문제가 없었는데, 문제될 점이 따로 있을까요 ?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
update 로직 짤때
위 사진처럼 짜면 put으로 있던 id에 updateParam으로 덮어씌워져서 업데이트 되는거 아닌가요? 테스트도 정상적으로 작동하는데 위에 4줄로 작성하면 더 좋은점이 어떤게 있나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
테스트에서의 bindingResult 오작동
안녕하세요. 스프링 Junit 테스트로 검증 부분을 테스트 하던 중 의도대로 되지 않는 부분이 있어서 질문드립니다. 먼저 테스트 하려는 컨트롤러는 JSON 데이터를 파라미터로 받아서 검증을 하고 (@Valid @RequestBody) 검증이 실패하면(bindingResult.hasErrors가 true일 때) 예외를 발생시키는데, 해당 예외는 컨트롤러 어드바이스로 받아 http 400코드를 응답 하게끔 설계를 하였습니다. (포스트맨으로 검증에 실패하는 데이터를 보냈을 때 400으로 응답되는 것을 확인하였습니다.) 그런데 테스트 코드에선 검증에 통과못하는 데이터를 넣어 mockMvc.perform으로 테스트 해보니 기대와는 다르게 http 200코드가 찍히면서 검증이 통과되는 결과가 나왔습니다. (andExpect에서 getResolvedException()이 null로 찍히는 것을 보니 bindingResult.hasErrors가 false가 되는 것 같습니다) 컨트롤러 어드바이스가 문제인가 싶어서 다른 예외를 발생시켜 테스트 해보았는데, 다른 예외는 잘 처리되더라구요. 혹시 이러한 검증 로직을 mockMvc로 테스트 하는 방법이 따로 있는 것 일까요? 스프링은 5.x.x 버전이며 junit은 4.12 버전을 사용 중 입니다.
-
미해결[리액트 1부] 만들고 비교하며 학습하는 리액트 (React)
Tab 상수 관련되서 질문 드립니다.
TabLable의 프로퍼티명을 상수 객체로 선언하신 이유가 있을까요? 추후 구현에서 TabType에 따라 안의 컨텐츠가 달라지니 map안에서 type === 'KEYWORD'와 같이 하드코딩 방지하기 위해서 일까요? (1) const TabType = { KEYWORD: 'KEYWORD', // 추천 HISTORY: 'HISTORY' // 최근 }; const TabLable = { [TabType.KEYWORD]: '추천 검색어', [TabType.HISTORY]: '최근 검색어' } Object.values(TabType) .map(tabType => ({ tabType, tabLable: TabLable[tabType] })) .map(this._getTab) .join('') ------------------------------- (2) const TabLable = { 'KEYWORD': '추천 검색어', 'HISTORY': '최근 검색어' } Object.entries(TabLable) .map((row) => { const [ tabType, tabLable ] = row; return { tabType, tabLable } }) .map(this._getTab) .join('');
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
요즘은 장기 로그인 유지를 많이 하는 거 같은데 맞나요?
원칙적으론 보안에 위협이 되겠지만 배민이나 쿠팡이나 등등 쇼핑 서비스를 보면 로그아웃을 하지 않는 이상 로그인이 유지시키는 것 같은데 아무래도 편의성 때문에 그렇겠죠? 그런 큰 서비스들은 회원 수만 몇천만일텐데 이런 경우도 다 메모리에 저장하고 있는 것인가요? 위와 같은 초대형의 사례들에선 세션 유지관리의 개념과 철학이 아예 근본부터 다를 것 같은데 어떤 식으로 관리 되는 것인지 궁금합니다. 아니면 그런 거 없이 동일한 건가요?
-
미해결윤재성의 만들면서 배우는 Spring MVC 5
JAVA에 ContentBean의 content_data가 int형이여도 되는이유가 뭔가요
안녕하세요. 현재 강의에서 XML, JAVA 모두 kr.co.softcampus.beans 패키지 안에 ContentBean.java 클래스에서 content_data변수를 String으로 사용하고 있습니다. 하지만, java프로젝트에서 String이 아니라 int로 설정하여도 작동되어서 문의드립니다. 왜 그런가요? XML의 경우는 안된다고 나옵니다.(당연히..)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
getter setter 인텔리제이에서 만드는 법
안녕하세요. getter setter를 만들려고 했는데 alt+Insert를 해도 generate에 test와 copyright만 뜨고 다른게 뜨지를 않습니다. 이럴땐 getter setter를 어떻게 만들어야 할까요 ㅠㅠ.. 구글링을 해봐도 모두 generate를 누르면 다 getter setter 탭이 뜨는데 인텔리제이 사용이 처음이라 어렵네요 ㅠㅠ..
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
model의 attribute를 뷰에서 어떻게 아나요?
위에 ModelAndView를 반환해주는 V1메소드는 addObject로 뷰에 넘어갈 "data"에 "hello!"값을 넣어서 리턴해주는 것을 이해하겠는데 밑에 model에 addAttribute 해도 실제 return 값은 뷰 네임인데 어떻게 뷰에서 렌더링할때 data가 hello! 인지 알까요? model을 리턴한 것도 아닌데 어떻게 전달되나요??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberRepository 에서 cannot find symbol 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 안녕하세요!! 동영상 강의 잘 보고 있습니다. 강의 내용 대로 따라서 하고 있는데 MemberRepository 를 작성하고 나면 cannot find symbol 오류가 발생합니다. 자동으로 import 되는게 강의와 다르게 import java.lang.reflect.Member; 로 되고 있습니다. 동영상 강의에는 import hello.hellospring.domain.Memeber; 되어 있는데 여기에서 오류가 발생하고 있습니다. 어느 부분이 잘못 됐을까요.. package hello.hellospring.repository;import java.lang.reflect.Member;import java.util.List;import java.util.Optional;public interface MemberRepository { Member save(Member member); Optional<Member> findById(Long id); Optional<Member> findByName(String name); List<Member> findAll();}
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
forward에 관한 질문이 있습니다!.
안녕하세요 좋은 강의 항상 감사합니다!. 강의 내용에 "다른 뷰는 실제 뷰를 렌더링하지만, JSP의 경우 forward()를 통해서 해당 JSP로 이동해야 랜더링이 된다!" 는 내용이 이해가 되지 않습니다.ㅜ_ㅜ 이전 질문에 JSP가 아닌 다른 템플릿은 바로 렌더링이 진행된다? 는게 무슨의미일까요 ?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
${} 문법 관련 질문입니다!
${} 문법 사용 시 프로퍼티 접근법에 의해서 데이터 조회 시에는 getId()가, 저장할 때는 setId()가 자동으로 호출된다고 하셨는데 그럼 ${member.id} 를 작성했을 때 member.setId()를 호출하려면 어떤 식으로 코드를 작성해야 하나요??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서버를 늘린다는 것이
1. 서버를 늘린다는 말이, 쓰레드를 늘릴 수 있게 서버의 성능을 올리거나 처리할 수 있는 컴퓨터들을 추가하는 건가요? 1-1. 그렇다면 서버의 성능을 올릴 때 제가 사용하던 서버의 컴퓨터 메모리, cpu 들을 올린다는 의미인가요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Connection is closed 에러발생(해결)
안녕하세요 강사님! 덕분에 수업 잘 듣고있습니다. 스프링 통합 테스트 강의에서, 테스트 코드의 join함수를 실행시켰더니 java.lang.IllegalStateException: java.sql.SQLException: Connection is closed 에러가 발생했습니다. 원인파악을 위해 join함수 처음부터 천천히 디버깅을 시도했는데, JdbcMemberRepository 클래스의 save함수에서 try 구문의 conn을 할당받는 첫번째 pstmt변수에서 IllegalStateException을 발생시켰습니다. 어떤 원인으로 에러가 발생했으며, 해결방법이 궁금합니다. 아래에 제가 작성한 오류와 연관된 코드들과 에러메시지 첨부합니다. *close함수에서 conn.close()를 close(conn)으로 수정했더니 해결됐습니다. [테스트코드] [JdbcMemberRepository 클래스] [MemberService 클래스] [에러메시지]
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Repository와 Service의 이해
안녕하세요! 강의를 다시 보다보니 제대로 이해한건지 확실히 하고 넘어가고 싶어서 글을 쓰게 되었습니다. Repository에서 interface로 선언한 것은 각 기능별로 저장할 때 어떤 타입? 으로 저장할지(list 등) 이며 이를 가지고 class에서 implements를 하여 실제 구현체를 만드는데 각 기능별로 저장한 값을 어떻게 반환할지 단순히 데이터의 저장을 위한 기능 Service에서는 앞서 Repository와 Domain에서 정한 것을 가지고 실제로 동작하는 기능(조건이 있다면 조건 로직, 검증을 해야한다면 검증 로직 포함)을 작성하는 것으로 이해했습니다. 실제 구현 할 때 Service 부분을이 아무래도 비즈니스 로직이다보니 해당 부분에서 오류가 발생한다면 전반적인 작동에도 문제가 생기겠죠?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
TimeTraceAop를 SpringConfig에 Bean으로 등록시 에러
[SpringConfig] [TimeTraceAop] [ERROR] 어떤문제인지 잘모르겠습니다
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
서비스 계층에서 비즈니스 로직을 넣은 이유?
안녕하세요, 몇 가지 궁금한게 있어서 질문드립니다. 1. (2:10 )서비스 계층에서 로그인 체크 비즈니스 로직을 사용한 이유가 있을까요?? 2. (8:10) 글로벌 오류로 처리하고 다시 폼으로 돌려보냈는데, 그렇다면 예외 처리는 어떤 경우에 써야하는 것인가요?? 항상 답변 감사합니다!!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradle build 관련 오류 질문 드립니다(TestSuiteExecutionException)
질문용 파일 링크: https://drive.google.com/file/d/1H7Jk68AinSPuCjEWiavLgFMpQtEuHdhT/view?usp=sharing gradle build를 실행할 때 계속 오류가 납니다. 우측의 Gradle Tab > (프로젝트명) > Tasks > build > build 실행jar 파일만 생성시킬 땐 무사히 만들어지는데 build 명령을 내릴 때는 test code 단계에서 계속 오류가 납니다. test code가 분명 있는데도 찾지를 못하네요. ClassNotFoundException 자주 하는 질문에 적어주신 방법은 다 시도해봤습니다. 1. IntelliJ IDEA로 test code 실행주체 바꾸기, 2. 설정이 java 11로 제대로 되어있는지 확인하고 바꾸기(자주 하는 질문 매뉴얼(https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.f9xqb7l8nuph)에 적으신 대로 선택했습니다). 3. project close 한 다음에 build.gradle 파일을 open as project로 열어서 재실행하기 4. 혹시나 버전 호환성 문제일까 싶어서 원래는 2.6.4 버전이었는데 강의에서 나온 2.3.1 버전으로 다운그레이드해서 재실험해봤거든요. 그런데도 똑같은 오류가 계속 뜨네요. 위의 파일 링크 안에도 포함되어있긴 하지만, 더 빨리 찾으시라고 아래에 error log 따로 적어봅니다. org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not execute test class 'KYH.Elementary.ElementaryApplicationTests'. at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:53) at java.base@11.0.14/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@11.0.14/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base@11.0.14/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@11.0.14/java.lang.reflect.Method.invoke(Method.java:566) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker$2.run(TestWorker.java:176) at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60) at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:133) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) Caused by: org.gradle.internal.UncheckedException: java.lang.ClassNotFoundException: KYH.Elementary.ElementaryApplicationTests at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:68) at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:41) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.loadClass(JUnitPlatformTestClassProcessor.java:112) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.access$100(JUnitPlatformTestClassProcessor.java:54) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.execute(JUnitPlatformTestClassProcessor.java:89) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.execute(JUnitPlatformTestClassProcessor.java:79) at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51) ... 18 more Caused by: java.lang.ClassNotFoundException: KYH.Elementary.ElementaryApplicationTests at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:398) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.loadClass(JUnitPlatformTestClassProcessor.java:110)
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
HandlerMethod로 다운캐스팅하는데서 궁금증이 있습니다.
스프링1 강의에서 핸들러 매핑시 스프링은 어노테이션기반의 컨트롤러를 RequestMappingHandlerMapping 타입으로 등록한다고 배운것 같습니다. 인터셉터의 preHandle이 어뎁터를 실행시키기 전에 실행된다면, 매개변수인 Object handler가 RequestMappingHandler관련타입으로 등록되어있을것이라 생각했는데... HandlerMethod타입으로 등록되어있다 하셔서 제가 무엇을 놓친것인지 궁금합니다. RequestMappingHandlerAdapter에도 handle 메서드에 HandlerMethod를 파라미터로 받고있는것으로 보면.. 스프링이 어노테이션 기반 컨트롤러를RequestMappingHandlerMapping에 등록할때부터 HandlerMethod타입으로 변환해서 올려준다고 생각하면 맞을까요?