묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
자바8로 하면 안되는 걸까요?
자바11로 하는 이유가 궁금합니다~~
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
혼자서 삭제 구현중에 Request method 'DELETE' not supported 오류 질문드립니다!
안녕하세요 강의 너무 잘 듣고 있습니다!! CRUD중 D가 없어서 직접 구현하던중에 오류에 부딪혔는데 해결할 수 없어서 질문드립니다 ㅠㅠ 먼저 HiddenHttpMethodFilter를 사용해야 HTML Form에서 PUT, DELETE를 사용할 수 있다고 알고있습니다. 따라서 application.properties에 다음과같이 필터를 추가했습니다. # HTML form에서 GET, POST 뿐 아니라 PUT, DELETE도 사용하기 위해서 설정 spring.mvc.hiddenmethod.filter.enabled=true 이후 editForm.html에서도 다음과 같은 delete input태그 및 삭제 버튼을 추가했습니다. <form action="item.html" th:action method="post"> <input type="hidden" name="_method" value="delete"> . . 중략 . <div class="col"> <button class="w-100 btn btn-primary btn-lg" type="submit" th:formaction="|@{/basic/items/{itemId}/edit(itemId = ${item.id})}|">저장 </button> </div> <div class="col"> <button class="w-100 btn btn-primary btn-lg" type="submit" th:formaction="|@{/basic/items/{itemId}/edit/delete(itemId = ${item.id})}|">삭제 </button> </div> </div> </form> 이후 다음과 같이 @DeleteMapping 컨트롤러를 작성했습니다. @DeleteMapping("/{itemId}/edit/delete") public String deleteForm(@PathVariable Long itemId, RedirectAttributes redirectAttributes) { Item deletedItem = itemRepository.delete(itemId); redirectAttributes.addAttribute("itemName", deletedItem.getItemName()); redirectAttributes.addAttribute("status", true); return "redirect:/basic/items"; } 문제가 되는 부분은 삭제 버튼은 잘 동작하고, redirectAttribute까지 잘 적용됩니다만, 오히려 저장 버튼을 누르면 Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported] 오류가 발생하네요 아무래도 기존 저장이 POST가 아닌 DELETE로 전송되어 생기는 문제같습니다. 궁금한점은 이렇게 DELETE와 POST를 하나의 폼에서 다른 버튼을 눌렀을때 각각 동작하게 하는 방법은 없고, 각각 다른 폼을 이용해야 하는건지 궁금해서 질문드립니다!! 감사합니다!
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
인텔리j 버전 어떤게 필요한가요??
안녕하세요. 스프링 강의 로드맵에 있는 모든 강의를 구매 했는데 인텔리j 버전 확인을 안했네요.. 혹시 모든 강의가 ultimate 버전으로 강의가 진행되나요? 만약 그렇다면 저는 커뮤니티 버전으로 강의를 따라가도 괜찮나요? 특히 '스프링 DB1,2편'이 있던데 JDBC 처럼 ultimate 버전에서만 할 수 있다거나 하진 않나요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링 컨테이너와 서블릿 컨테이너
안녕하세요! 강의를 든던중 궁금한 점이 있어서 이렇게 질문 남깁니다. 스프링 컨테이너는 서블릿 컨테이너의 한 종류라고 인식을 해도 되는걸가요?
-
미해결
yaml & yml 문법중 리스트 호출 순서에 관하여 문의 드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안드로이드 시스템에 id가 10,11,12,13,14,15 로 되어있는 프로세스를 수행하고자합니다. matrix: os_type: ['ANDROID'] id: ['10', '11', '12', '13', '14', '15'] steps: - name: '테스트 실행' run: |- curl -F '"os_type":"${{ matrix.os_type }}", "id":${{ matrix.id }} > post_result.txt 위 코드로 작성하였을 시 10, 11, 12, ,13, 14, 15 번 순서대로 수행되지않고 15, 12, 10, 13, 14 등 랜덤하게 수행이 되는데요, 다른 언어에서는 리스트를 정의한 순서대로 출력되는데 yml코드로는 랜덤하게 수행이 됩니다. 리스트를 순서대로 수행하고자 하려면 어떻게 해야할까요?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
Q파일 경로
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강의를 보다가 궁금한 점이 생겨서 질문드려요 generated 경로를 buildDir에 넣는 방법이 있고, 이번 강의처럼 main 아래에 두는 방법이 잇는 것 같은데요 둘 중에 어느 방법이 좀더 좋은 걸까요? 사실 두 방법 개발하는데 큰 문제는 아닌 것 같지만 혹시 의견을 주실 수 있으실까요? jpa, 스프링 완전정복 모두 굉장히 잘 보고 있습니다. 감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberForm의 패키징 위치?
강의 초반부에 MemberForm객체를 domain 패키지가 아닌 controller 패키지에 생성하시는 이유가 MemberForm 객체의 주 사용 클래스가 controller여서가 맞는지 궁금합니다..!
-
미해결스프링 핵심 원리 - 기본편
"스프링 DB 1,2편"과, "스프링 부트와 JPA 실무 완전 정복 로드맵"은 어떤 차이가 있고 어떤 걸 먼저 접하는 게 좋을까요?
제목이내용입니다. 레거시 프로젝트 경력이 있는 편이라 쿼리는 좀 아는데 JPA는 전혀 접해보지 못해 JPA를 최대한 빨리 학습하고 싶습니다. MVC 1,2편을 빨리 끝내고 JPA 로드맵을 바로 수강하는 것이 유리할까요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의자료
영한님이 강의할 때 사용하시는 강의자료(?)는 따로 업로드 안되어있는건가요? 제가 못찾는거인지 궁금합니다.... 베어라고 되어있는데 이 자료가 따로 업로드되어 있는지 궁금합니다..!!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
http 요청 데이터 - post html form
요러케 여기서 전송을 누르면 다음으로 넘어가야하는데, 저는 누르면 이런 식으로 에러 뜹니다. 코드는 따라 타이핑 하였으며, html만 복붙했습니다,
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
예외를 catch 할 때는 import가 필요 없나요 ?
MemberRepository 4_1 에서 catch(SQLException e) 로 catch 하면 MyDbException을 던져줌으로서 체크예외를 언체크 예외처럼 사용하는법은 이해했습니다 근데 Catch할 때 SQLException은 왜 import 없이 사용할 수 있는건가요 ?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
@Transactional generate key 질문
안녕하세요! '스프링 통합 테스트' 강의 중 궁금한 사항이 생겨서 올립니다. @Transactional 어노테이션을 붙이면 각 테스트 항목 실행 후 롤백한다고 하셨는데, insert문 실행됐을 때 자동 업데이트되는 키 값은 계속 증가합니다. 왜 이 값은 롤백이 되지 않는지 문의드립니다. 감사합니다!
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Exception 질문입니다
SQLException 와 ConnectException 부모로 SCException 같은 것을 하나 만들어서 throws SCException 하는 것은 안좋은 방법인가요 ??? 그러면 체크 예외를 체크할 수 있으면서 다른 기술에도 의존하지 않게 되지 않나요 ??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
야생형 코스대로 진행하려는데
야생형 커리큘럼 순서가 어떻게되는지 알수있을까요? 구글링해도 안나와서요 ㅠㅠ
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 매니저가 커넥션을 생성하는게
커넥션 풀에서 커넥션을 꺼내오는 것인가요? 그림에서 커넥션 풀은 안나오는데 사용하지 않는건가요 ?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
실무에서도 이렇게하나요??
검색하다보니 스프링 시큐리티로 로그인하는방법이 있어서 그런데 로그인에 대한 이론만 알려주시는건지 진짜 이렇게 실무에서도 쓰는지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
@Aspect 사용할수 없음
Aop 섹션 Aop적용 강의에서 @Aspect 를 사용하시는데 저는 사용할수가 없습니다.. 라이브러리를 따로 추가해야하나요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
assertThat.contains
@Test void findAll(){ //given Item item1 = new Item("item1", 1000, 10); Item item2 = new Item("item2", 1000, 10); itemRepository.save(item1); itemRepository.save(item2); //when List<Item> result = itemRepository.findAll(); //then assertThat(result.size()).isEqualTo(2); assertThat(result).contains(item1,item2); } 항상 강의 즐겁게 듣고 있습니다. 강의를 듣던중 contains가 조금 궁금해서 질문드립니다. Item item1 = new Item("item1", 1000, 10); Item item2 = new Item("item2", 1000, 10); item1과 item2는 new로 생성한 객체여서 id가 null로 되어있다고 생각하고 List<Item> result = itemRepository.findAll(); result에는 itemRepository.save의 sequence++와 setId를 통해 Id값이 저장된 [1,Item], [2,Item] 두개의 키와 value가 저장되어 있다고 생각합니다.. 근데 여기서 contain로 비교하면 item1 Item(id=null, itemName=item1, price=1000, quantity=10) result안의 값 Item(id=1, itemName=item1, price=1000, quantity=10) item2 Item(id=null, itemName=item2, price=1000, quantity=10) result안의 값 Item(id=2, itemName=item2, price=1000, quantity=10) 서로 달라서 테스트가 실패해야하지않을까? 라는 생각이 들더라구요.. asseretThat( A ) .contains( B )가 dto를 비교할때 public Item(String itemName, Integer price, Integer quantity) { this.itemName = itemName; this.price = price; this.quantity = quantity;} 생성자에 있는 값으로만 비교하는걸까요?(추가해봐도 참이나오네요..) contains는 무엇을 기준으로 판단을 하는걸까요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
속도의 차이
Assertions.assertEquals(result,member);하고assertThat(member).isEqualTo(result);에서..위 메소드는 실행시간이 23ms이고아래 메소드는 실행시간이 70ms로 나오는거 같은데..아래 문법이 더 좋은점이 있나요?..
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberServiceTest 회원가입 오류
안녕하세요 질문 사항이 있어 글을 남깁니다. 구글링을 통해 Member findMember = memberService.findOne(savId).get(); 부분이 오류가 있다는 것을 알았습니다. 그리고 나서 다시 로직을 보면서 다시 하여도 똑같은 오류가 발생해 글을 올립니다. MemberServiceTest package com.test.inflearn.service;import com.test.inflearn.domain.Member;import org.assertj.core.api.Assertions;import org.junit.jupiter.api.Test;import java.util.Optional; //회색import static org.junit.jupiter.api.Assertions.*; /회색class MemberServiceTest { MemberService memberService = new MemberService(); @Test void 회원가입() { //given (뭔가가 주어졌을 때) Member member = new Member(); member.setName("hello"); //when (이걸로 실행 했을 때) Long savId = memberService.join(member); //then (결과가 이게 나와야 한다.) Member findMember = memberService.findOne(savId).get(); Assertions.assertThat(member.getName()).isEqualTo(findMember.getName()); } @Test void findMembers() { } @Test void findOne() { }} MemberService package com.test.inflearn.service;import com.test.inflearn.domain.Member;import com.test.inflearn.repository.MemberRepository;import com.test.inflearn.repository.MemoryMemberRepository;import java.util.List;import java.util.Optional;public class MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); /** * 회원 가입 */ public Long join(Member member) { //같은 이름이 있는 중복 가입 X validateDuplicateMemory(member); //중복 회원 검증 memberRepository.save(member); return member.getId(); } private void validateDuplicateMemory(Member member) { memberRepository.findByName(member.getName()) .ifPresent(m -> { throw new IllegalStateException("이미 존재하는 회원 입니다."); }); } /** *전체 회원 조회 */ public List<Member> findMembers() { return memberRepository.findAll(); } public Optional<Member> findOne(Long memberId) { return memberRepository.findById(memberId); }} repository = MemberRepository(인터페이스) package com.test.inflearn.repository;import com.test.inflearn.domain.Member;import java.util.List;import java.util.Optional;public interface MemberRepository { Member save(Member member); Optional<Member> finById(Long id); Optional<Member> findByName(String name); List<Member> findAll(); Optional<Member> findById(Long memberId);// Optional<Member> findById(Long memberId);} repository = MemberRepository (클래스) package com.test.inflearn.repository;import com.test.inflearn.domain.Member;import java.util.*;public class MemoryMemberRepository implements MemberRepository { private Map<Long, Member> store = new HashMap<>(); private static long sequence = 0L; @Override public Member save(Member member) { member.setId(++sequence); store.put(member.getId(), member); return member; } @Override public Optional<Member> finById(Long id) { return Optional.ofNullable(store.get(id)); } @Override public Optional<Member> findByName(String name) { return store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); } @Override public List<Member> findAll() { return new ArrayList<>(store.values()); } @Override public Optional<Member> findById(Long memberId) { return Optional.empty(); } //test 를 한번 할때 마다 지워준다. public void clearStore() { store.clear(); }} domain = Member package com.test.inflearn.domain;public class Member { private Long id; private String name; //get, set public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }} 오류 메시지 at java.util.Optional.get(Optional.java:135) at com.test.inflearn.service.MemberServiceTest.회원가입(MemberServiceTest.java:26) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)