묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
MVC와 API
안녕하세요!!다름이 아니라 제가 그럼 프론트엔드 기술(react, vue 등)을 모르는데 혼자 화면까지 나오는 프로젝트를 진행하고 싶다면 SSR인 템플릿 엔진을 이용한 MVC패턴으로 개발하는 게 API 방식보다 더 나을까요?? 그러기엔 템플릿 엔진을 사용하더라도 JS나 css는 기본적으로 할 줄 알아야 하는데 ㅜㅜ 따로 JS나 CSS를 배우지 않고서는 혼자서는 무리겠죠?? 아 그리고 MVC 패턴이 SSR방식이고 API가 CSR 방식이라고 이해해도 괜찮을까요??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
webapp폴더는 그냥 만들기만 하면 url매핑 안해도 접근이 가능한데 이유가 뭔가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]webapp폴더는 그냥 만들면 url매핑 안해도 접근이 가능한데 이유가 뭔가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
로그인 회원가입에서 더 붙이기
로그인 회원가입 로직만 떼어서, 디자인패턴을 1군데 이용해서 3클래스 이상 변화시킬라고 하는데요추가로 더 보완하는 느낌이에요이 패턴중에서 적용할만한 패턴과, 어디에 적용해야할지 가이드좀 잡아주실 수 있나요?
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
MVC vs API
아 아까 MVC와 API의 차이에 대해 질문했었는데요...제가 그럼 프론트엔드 기술 (react, vue 등)을 모르는데 혼자 화면까지 나오는 프로젝트를 진행하고 싶다면 SSR인 템플릿 엔진을 이용한 MVC패턴으로 개발하는 게 더 나을까요??그러기엔 템플릿 엔진을 사용하더라도 JS나 css는 기본적으로 할 줄 알아야 할 거 같은데 ㅜㅜ혼자서는 무리겠죠??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
generate에 getter sectter이 없어요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]이게 다예요alt + insert 도 눌러보고 마우스 우클릭하고 접근해봐도 게터섹터가 없네요
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
AuthenticationManager에 초기화에 대해 질문있습니다
@Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception { return configuration.getAuthenticationManager(); }위 처럼 Bean 으로 등록하게되면내부 메서드에서 Bean으로 등록된Builder를 통해 등록하는거 까지는 이해했는데요.근데 여기서 setShareObject와 같은게 없는데 return http.build();빌드하게되면 HttpSecurity 메서드의 @Override protected void beforeConfigure() throws Exception { if (this.authenticationManager != null) { setSharedObject(AuthenticationManager.class, this.authenticationManager); } else { ObservationRegistry registry = getObservationRegistry(); AuthenticationManager manager = getAuthenticationRegistry().build(); if (!registry.isNoop() && manager != null) { setSharedObject(AuthenticationManager.class, new ObservationAuthenticationManager(registry, manager)); } else { setSharedObject(AuthenticationManager.class, manager); } } } 가 호출되어 여기서else 조건을 타 getSharedObject 로 AuthenticationManagerBuilder 빌더 클래스를 다시 꺼내와서 빌드를 하는데 이렇게 되면 http.build 과정의 인증관리자와스프링컨테이너에 있는 인증관리자는서로 다른건가요? 같다면 우리가 등록한 Bean이 build 과정에서 나올것같은데못찾겠습니다 ㅠㅠ..
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
Itemservice-db와 item service-db-start 두개다 존재하는데 어떤거 여나요?
두개의 폴더가 모두 존재하는데 start의 폴더를 이름변경하여 덮어쓰는것인지 아니면 이미 존재하는 itemservice-db를 오픈하면 되는것인지 혼란이 옵니다.두개의 폴더 모두 오픈해보았는데 db-start폴더는 item클래스가 영상과 같지만 generated폴더가 존재하지 않고 그냥 db 폴더는 item클래스가 영상과 다르지만 generated폴더가 존재합니다 어떤걸 이용하면 되나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO 초기화 관련 질문드립니다.
@Data public class MemberSessionDto { private Long id; private String email; private String password; private String name; private Address address = new Address(); private List<Post> posts; } DTO의 필드 중 데이터가 들어있지 않은 필드가 존재할 수도 있을텐데요, 이럴 때는 new Address()와 같이 초기화를 해주는 것이 좋을까요, 아니면 타임리프에서 th:if="${findMember.address != null}"와 같이 null 처리를 해주는 것이 좋을까요? 도움이 되실까 해서 엔티티 코드도 추가로 첨부하겠습니다.package com.myproject.jpaboard.domain; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PUBLIC) public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String email; private String password; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Post> posts = new ArrayList<>(); @Override public String toString() { return "Member{" + "address=" + address + ", name='" + name + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + ", id=" + id + '}'; } }
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
SecurityContextHolderStrategy 설명해주신 부분에서 기존 방식 변경 방식에 대한 질문입니다.
안녕하세요, 24:00 에 말씀해주시는 SecurityContextHolderStrategy 사용하기부분에 기본방식과 변경방식 설명해주시는 부분에서 이해가 안되는 부분이 생겨 질문드립니다.기존방식과 변경방식의 구현된 소스코드를 보니 내부에서(SecurityContextHolder.crateEmptyContext() 내부) 도 결론적으로는 strategy.createEmptyContext() 를 delegate 하는 방식으로 호출 되는것을 보았습니다. 6.x, 5.x, 4.x 모두 동일한듯합니다. /** * Allows retrieval of the context strategy. See SEC-1188. * @return the configured strategy for storing the security context. */ public static SecurityContextHolderStrategy getContextHolderStrategy() { return strategy; } /** * Delegates the creation of a new, empty context to the configured strategy. */ public static SecurityContext createEmptyContext() { return strategy.createEmptyContext(); } AbstractAuthenticationProcessingFilter 쪽에서 successfulAuthentication 쪽에 로직dl 6.x, 5.7 이하 버전 대가 다른단것은 확인했는데 /** * Puts the <code>Authentication</code> instance returned by the authentication * manager into the secure context. */ protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException, ServletException { this.logger.debug(LogMessage.format("Authentication success: %s", authResult)); SecurityContext context = this.securityContextHolderStrategy.createEmptyContext(); context.setAuthentication(authResult); this.securityContextHolderStrategy.setContext(context); this.securityContextRepository.saveContext(context, request, response); if (this.eventPublisher != null) { this.eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(authResult, this.getClass())); } if (this.authenticationSuccessHandler != null) { this.authenticationSuccessHandler.onAuthenticationSuccess(request, response, authResult); } }/** * Puts the <code>Authentication</code> instance returned by the authentication * manager into the secure context. */ protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException, ServletException { if (logger.isDebugEnabled()) { logger.debug("Authentication success: " + authResult); } SecurityContextHolder.getContext().setAuthentication(authResult); // Fire event if (this.eventPublisher != null) { eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent( authResult, this.getClass())); } if (authenticationSuccessHandler != null) { authenticationSuccessHandler.onAuthenticationSuccess(request, response, authResult); } }추측건데 strategy 쪽을 세팅할수있는 부분이 추가됨에따라 달라진 부분이라 생각이 되어 이부분도 말씀하신 의도와는 다를듯하여 /** * Sets the {@link SecurityContextHolderStrategy} to use. The default action is to use * the {@link SecurityContextHolderStrategy} stored in {@link SecurityContextHolder}. * * @since 5.8 */ public void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy) { Assert.notNull(securityContextHolderStrategy, "securityContextHolderStrategy cannot be null"); this.securityContextHolderStrategy = securityContextHolderStrategy; } 경쟁조건 때문이라고 설명하신 부분에서 말씀하시는 의도를 다시 한번 알수있을까요.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
과제 5번 cannot find symbol (sequencedMap) 오류
과제 5 관련 어제자 스레드에 올려주신 파일에서DiceRollResults.java package com.group.libraryapp.day5Practice; import java.util.LinkedHashMap; import java.util.SequencedMap; public class DiceRollResults { private final SequencedMap<Integer, Integer> map = new LinkedHashMap<>(); public DiceRollResults(int maxDiceNumber) { for (int i = 1; i <= maxDiceNumber; i++) { map.put(i, 0); } } public void count(int rollResult) { int updated = map.get(rollResult) + 1; map.replace(rollResult, updated); } public SequencedMap<Integer, Integer> getMap() { return map; } } cannot find symbol (class sequencedMap) 오류가 나는데, 해결방법이 있을까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
MVC와 API의 차이점
안녕하세요 강사님!!다름이 아니라 공부를 하다가 MVC와 API의 차이점(?)에 대해 알아보게 되었습니다!그래서 내린 결론이Spring MVC구조의 @Controller는 컨트롤러의 리턴값이 ViewResolver에 의해 해석되어서 특정 View가 html응답으로 전송된다.반면 REST API구조의 @RestController에 의한 호출은 View를 리턴하는 것이 목적이 아닌, 데이터를 전송하는 것을 목적으로 응답이 전송되어 진다.라고 내렸습니다.첫번째로, 위에서 제가 내린 결론이 맞는 말인지와두번째로, 그럼 MVC를 쓰는 경우와 API를 쓰는 경우가 언제인지가 궁금합니다.제가 아직 개념이 부족해서 그런건지는 몰라도 MVC를 쓰면 프론트엔드의 역할이 없어지는게(?) 아닌가 하는 착각이 들어서...답변 부탁드리겠습니다!!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품수정에서 book 타입 캐스팅 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]상품 수정할때 updateItemForm 메서드를 작성하면서Book item = (Book) itemService.findOne(itemId);이 코드를 작성하는데, 이게 가능하려면 itemService.findOne 메서드에서 리턴하는 객체가 원래 업캐스팅됐던 객체여야 가능한거 아닌가요? itemService.findOne은 itemRepository.findOne(itemId)을 리턴하고, ItemRepository의 findOne은 em.find(Item.class, id) 을 리턴합니다. 이 과정에서 언제 업캐스팅 되는건가요? 혹시 질문이 잘못 됐거나 제가 잘못 알고 있는 내용이 있다면 설명해주시면 감사하겠습니다.
-
미해결견고한 결제 시스템 구축
excludeTags 오류
안녕하세요 강사님build.gradle에서 excludeTags("TooLongTime")를 추가하고 Reload All Gradle Projects 를 하는 과정에서아래와 같이 오류가 발생합니다 Caused by: java.lang.ClassNotFoundException: org.gradle.internal.impldep.org.junit.platform.launcher.TagFilter Unable to load class 'org.gradle.internal.impldep.org.junit.platform.launcher.TagFilter'.This is an unexpected error. Please file a bug containing the idea.log file.
-
미해결스프링 부트 - 핵심 원리와 활용
라이브러리의 이름이 memory인 이유를 모르겠습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 우리가 memory-v1이라는 프로젝트를 빌드해서 나온 결과물이 바로 memory-v1이라는 jar파일이고, 이것을 라이브러리 화 한 것인데, project-v1에서 이 라이브러리를 사용한 것을 보면 다음과 같이 import합니다. import memory.MemoryFinder 여기서 라이브러리의 이름이, memory-v1이 아닌 memory로 된 이유가 있나요?!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
POST 컨트롤러를 수행한 뒤에도 현재 페이지를 보여주는 방법
POST 매핑 동작을 수행한 뒤에도 기존에 머물렀던 페이지로 리다이렉트 하는 방법이 있을까요?예를 들어, 로그아웃 버튼을 클릭한 뒤에도 기존 페이지를 보여주는 상황이 이에 해당됩니다.그렇다면 현재 페이지의 주소에 대한 정보를 컨트롤러에서 가지고 있어야 할텐데 어떤 방식으로 구현하는 것이 좋을지 궁금해서 질문 남깁니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
영속성에 대해
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 듣다가 궁금해져서요!@Transactional 어노테이션 안에 메소드에선 영속성이고 그게 아니면 준영속성이라는 말씀이신건가요??
-
미해결견고한 결제 시스템 구축
UPDATE_PAYMENT_EVENT_EXTRA_DETAILS_QUERY 실행 시 오류
안녕하세요 강사님실제 결제 테스트 진행 시 아래와 같은 오류가 발생하는데혹시 토스에서 리턴하는 값이 달라져서 값 타입이 안맞아서 그런걸까요..?강사님이 제공해주신 깃헙으로 진행하더라도 동일한 에러가 발생합니다ㅠㅠ
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
"상품 목록 - 타임리프" 강의 관련 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.thymeleaf 템플릿을 이용하여 만든 items.html의 코드 상에 <link th:href="@{/css/bootstrap.min.css}" href="../css/bootstrap.min.css" rel="stylesheet">이 부분에 대해서 질문이 있습니다.localhost:8080/basic/items 로 접속을 하면 BasicController의 items 메소드에 의해서 /basic/items.html 인 뷰 템플릿을 렌더링 하는것 까지는 이해했습니다.제가 아직 html 코드에 익숙하지 않아서 궁금한 점인데, 1번째 질문.th:href="@{/css/bootstrap.min.css}" 이 부분에서 thymeleaf가 자동으로 내부에서 localhost:8080/css/bootstrap.min.css 를 호출해서 정적 리소스 내에 존재하는 bootstrap.min.css 파일을 찾고 items.html 과의 관계(rel="stylesheet")를 정의해주는건가요...??? 2번째 질문.그래서 th: 태그가 없는 경우에는 정적으로 static/html/items.html이기 때문에 href="../css/bootstrap.min.css" ../를 통해서 static 디렉토리로 올라간 다음 거기서 부터 다시 static/css/bootstrap.min.css 를 탐색하는건가요??
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
gradle
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]2분 14초 상품 상세로 넘어가는 과정에서 다른 질문 글을보고 Gradle을 사용해서 빌드하고 실행하는 과정을 하니 해결이 되었는데요. 혹시 이방법 말고는 없나요? 느리다는 이유로 Gradle을 사용하지 않은걸로 아는데 이후에도 그냥 gradle로 사용해도 상관없나요?
-
미해결스프링 부트 - 핵심 원리와 활용
@SpringBootTest어노테이션 역할
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] @SpringBootTest역할이 정확히 무엇인지 알고싶습니다. 이 어노테이션을 붙이면 스프링 컨테이너에 등록된 빈을 사용할 수 있는것으로 알고있는데, 이걸 안붙이면 스프링컨테이너에 등록된 빈을 사용할 수 없나요?