묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
controller - service -repository 와 MVC
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]앞서 들었던 controller - service -repository 개념과 MVC 개념의 정리가 잘 안되서 그런데controller는 frontServlet으로 생각하면 되고 ,service,repository는 핸들러라 생각하면 되나요?그리고 servlet이랑 자바빈 이랑은 다른 개념인가요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
인터셉터에서 HTTP 메서드를 구분하는 방법이 있을까요?
[질문 내용]안녕하세요! 강의 잘 듣고 있습니다!!다름이 아니라 restful하게 url을 설계하려 하면 url경로는 같지만 http 메서드를 다르게 하여 구분을 하는 경우가 많은 거 같습니다.이 경우 InterceptorRegistry를 통해 PathPattern을 구분하는 것 처럼 http메서드 또한 메서드 별로 구분하는 방법이 있는지 궁금합니다.감사합니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
이 코드를 그대로 사용해서 S3 업로드가 가능한가요?
결국 종착지는 S3에 올려서 사용하는 건데,이 코드를 그대로 사용해도 문제 없나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JdbcMemberRepository에서 어디가 잘못된걸까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용].중간에 conn 부분이랑 맨아래 throws SQLException 쪽에 빨간줄이 그어 있긴하는데 같은 코드인것 같은데 어디서 잘못된건지 잘 모르겠습니다. 제가 작성한 코드는public class JdbcMemberRepository implements MemberRepository{ private final DataSource dataSource; public JdbcMemberRepository(DataSource dataSource){ this.dataSource = dataSource; } @Override public Member save(Member member) { String sql = "insert into member(name) values(?)"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try{ conn = getConnection(); pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); pstmt.setString(1, member.getName()); pstmt.executeUpdate(); rs = pstmt.getGeneratedKeys(); if (rs.next()) { member.setId(rs.getLong(1)); } else { throw new SQLException("id 조회 실패"); } return member; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findById(Long id) { String sql = "select * from member where id = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setLong(1, id); rs = pstmt.executeQuery(); if(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } else { return Optional.empty(); } } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findByName(String name) { String sql = "select * from member where name = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, name); rs = pstmt.executeQuery(); if(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } return Optional.empty(); } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } private Connection getConnection() { return DataSourceUtils.getConnection(dataSource); } private void close(Connection conn, PreparedStatement pstmt, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (pstmt != null) { pstmt.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) { close(conn); } } catch (SQLException e) { e.printStackTrace(); } } @Override public List<Member> findAll() { String sql = "select * from member"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); List<Member> members = new ArrayList<>(); while(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); members.add(member); } return members; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } private void close(Connection conn) throws SQLException { DataSourceUtils.releaseConnection(conn, dataSource); } }
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
getClass()와 .class의 차이
실수로 LogTestController.class 를 getLogger의 파라미터로 넣어줬더니 debug와 trace 의 로깅은 찍히지 않더라구요 getClass()를 파라미터로 넣으니 잘 되던데 어떤 차이가 있는 건가요 ?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
로컬디스크가 아닌 다른 곳으로 접근하는법
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]터미널로 따라하려는 도중 강사님의 파일은 c에 있지만 저는 따로 E 로컬디스크에 저장되어있어 cd E:\Spring-workspace\hello-spring를 했는데 별다른 반응 없이 C에 머물러 있는 것 같은데 어떻게 접근해야하나요?
-
해결됨아키텍처 패턴 with iOS - GUI Architecture Patterns(이론)
제가 이해한게 맞는지 궁금합니다.
솔직히,, MVC나 MVP나 MVVM이나 머가 그렇게 다른지 잘 이해가 안가긴합니다..모델과 뷰를 분리하고 이를 컨트롤하는 영역을 어떻게 처리하면 좋을까 하는데서 조금씩 차이가 있어서 구분하려는게 목적인 걸까요. 뷰모델이라 한다해도 처리해야할 복잡성이 올라가면 결국 복잡해지는 건 똑같아 보입니다.. 그럼에도 불구하고 UIKit을 사용할 때 NVVM을 쓸라고 하는건 테스트가 용이하다는 이유랑, 그냥 옵저버 패턴 쓰고 싶어서인 것 같습니다. Combine이 나온 것도 뭔가 너네가 옵저버 방식 좋아하는 것 같으니까 만들었어 같은 느낌인 것 같고,, SwiftUI를 공부하면서 보니까 자연스럽게 Combine 쓰게되고 쓰다보니 자연스레 아래처럼 구조가 분리되는 것 같은데 이게 NVVM이 맞는 걸까요?뷰(들어오는 데이터 대로 그려지는 뷰 구조체 모음)모델(타입 or 인터페이스 모음)로직(뷰의 로직 처리 함수모음)스토어(상태 데이터모음)
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
RequestBodyStringController - requestBodyStringV3메소드 반환값 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]RequestBodyStringController - requestBodyStringV3메소드에서 반환값을 String으로 하면에러가 나는이유 + HttpEntity<>로 해야하는 이유가 궁금합니다.// 에러가 나는 코드 @PostMapping("/request-body-string-v3") public String requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException { String messageBody = httpEntity.getBody(); log.info("messageBody={}", messageBody); return "ok"; // return new HttpEntity<>("ok"); }
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
form태그의 action과 button의 onclick의 사용시기?
<div class="col"> <button class="w-100 btn btn-secondary btn-lg" type="button" th:onclick="|location.href='@{/items}'|"> 상품 관리 </button> </div> <div class="col"> <form th:action="@{/logout}" method="post"> <button class="w-100 btn btn-dark btn-lg" type="submit"> 로그아웃 </button> </form> </div> 상품관리 버튼에서는 button의 onclick을 이용해서 링크를 보내주고 로그아웃 버튼에서는 form태그의 action을 사용해서 링크로 보내주었는데 post의 형식으로 데이터를 보내줘야할때는 form의 action을 통해서 보내주고 get방식으로 보내줘야할때는 onclick을 이용해서 보내는 건가요??
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
혹시 단계별로 완성된 코드를 받을 수 있을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]검증부분부터 듣고싶은데 코드가 다 완성되어있어요!혹시 단계별로 완성된 코드가 올라간 깃허브가있을까요..?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
테스트 오류 납니다.
finadAllBean() 테스트 오류org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'discountPolicy': Failed to instantiate [hello.core.discount.DiscountPolicy]: Specified class is an interface basicScan() 테스트 오류org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'hello.core.order.OrderServiceImpl' available 오류 해결하려면 어떻게 해야 하나요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
모든 WAS가 멀티쓰레드를 지원하는게 맞나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]WAS가 멀티쓰레드를 지원하기 때문에 개발자는 쓰레드 관리에 신경을 크게 신경을 쓰지 않아도 된다고 하셨는데, 톰캣뿐만 아니라 모든 WAS는 멀티쓰레드를 지원하는 건가요??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서블릿 내장객체 관련 질문 드립니다
저는 request, response가 서블릿 내장 객체라고 알고 있었는데요, 강의 내용에 따르면 request와 response는 요청마다 새로 생성되고 서블릿 객체는 요청마다 생성되지 않고 싱글톤으로 재사용한다고 알게 되었습니다.그럼 서블릿 내장 객체와 서블릿 객체가 다른 것인가요? 지금까지는 서블릿 내장 객체라는 것이 서블릿 객체 안에 포함되어 있다고 생각했는데 이건 아닌 것 같고 ..서블릿 컨테이너가 서블릿 객체를 관리하는 것이면 서블릿 내장 객체는 누가 관리해주나요? 서블릿 내장 객체와 서블릿 객체의 차이점을 알고 싶습니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
V1과 V2의 차이
V1은 컨트롤러에서 바로 렌더링을 진행하는 거고 V2는 MyView 객체를 생성해서 MyView에서 렌더링을 진행하는데요 이러면 얻는 이점이 뭐가 있나요? 코드만 더 작성해야되는데 손해 아닌가요 ?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Map에 들어가는 ControllerV1 객체
는 싱글톤이 아닌 것인가요 ? 스프링 빈으로 저장도 안해줬고, static을 선언해서 클래스 변수도 아닌데 이럴 경우에는 호출 할 때마다 ControllerV1 객체가 생성되고 process를 진행되는 형식인가요 ?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Locale 관련 질문입니다.
@Test void formattingConversionService() { DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(); conversionService.addConverter(new StringToIpPortConverter()); conversionService.addConverter(new IpPortToStringConverter()); conversionService.addFormatter(new MyNumberFormatter()); IpPort ipPort = conversionService.convert("127.0.0.1:8080", IpPort.class); assertThat(ipPort).isEqualTo(new IpPort("127.0.0.1", 8080)); assertThat(conversionService.convert(1000, String.class)).isEqualTo("1,000"); assertThat(conversionService.convert("1,000", Long.class)).isEqualTo(1000L); }여기서 따로 Locale을 설정하지 않았는 데도 자동으로 Locale.KOREA가 들어가서 1000을 넣었을 시 "1,000"으로 나오는 것 같은 데 이 Locale 값은 스프링이 자동으로 넣어주는 건가요??
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
th:value=""; 로 이전 데이터 가져오지 못하는 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@nullable로 잡혀있는 rejectedValue 을 addItemV1에서 new FieldError 매개변수에 넣지 않으니 가격이나 수량에 넣어줬던 값이 error 발생 시 그대로 저장이 안되더라구요. 그래서 구글링 후에bindingResult.addError(new FieldError("item", "price", item.getPrice(), false, null, null, "상품가격 범위 초과(1000~1000000)"));이런 식으로 넣으니까 강의처럼 값이 그대로 넘겨지긴 하네요. 영상에서는 해당 부분말고 상품명까지만 확인한거같은데 참고 부탁드립니다~
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
RedirectAttribute Url인코딩여부
return에 redirect:/ + 값 위와같이 URL매핑주소에 파라미터를 그대로 넘겨서 반환하게 된다면 URL 인코딩에 대한 위험성을 함께 지적하시면서 RedirectAttribute수업을 진행하였는데요.수업 중 status를 통한 유효성 검증 처리만 하고 인코딩 여부를 어떤식으로 확인할 수 있는지에 대한 내용이 생략된거 같습니다.혹시 따로 글로라도 확인시켜주실수는 있을까요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
애플리케이션 런 했을때 에러 발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요 vs코드에서 자바 배우려고 intellj(무료버전)를 설치 후 강의를 따라가고 있습니다. 그런데 HelloSpringApplication을 런 했을때 3가지 에러가 발생하는데 핸들링 부탁드립니다.크게는 이 3가지가 나오고, 이건 첫번째 에러인데 해결하지 못했습니다 ㅠㅠ답변 부탁드립니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원조회가 되지 않습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]회원등록을 하지 않았으 때 회원 조회를 하게되면 # 이름은 뜨게 되는데 회원등록을 하고 난 후 회원조회를 하게되면 오류가 뜹니다. 도와주시면 감사하겠습니다!https://github.com/JongchanJeon/starter_Spring 감사합니다.