묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 프레임워크는 내 손에 [스프1탄]
스프링 시큐리티 로그인 후 모달창 질문드립니다
(선생님 아래 댓글에 나름대로 해결책 적어놓았습니다!) 선생님 안녕하세요.기존 로그인 방식을 session에서 security로 바꾸면서 로그인에 성공하면 RedirectAttribute를 이용한 모달창 띄워주기는 어떻게 해야 하는지 고민됩니다.시큐리티 내부에서 /login.do 요청을 처리해주니 왠지 시큐리티 내부 필터에 설정을 해줘야 하나? 라는 생각이 듭니다.로그인에 실패하면 시큐리티에서 error를 파라미터를 넘겨주니, 로그인 성공 시 특정 파라미터를 1회성으로 넘겨주는 것이 있을까? 라는 생각도 듭니다.아니면.. 시큐리티로 로그인에 성공하는 순간 url경로를 설정하여 특정 컨트롤러에서 받아줘서 그곳에서 redirect를 해줘야 할까요? 아래의 사진은 기존 로그인 방식에서 RedirectAttributes의 addFlash를 이용한 참고사진입니다.감사합니다!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
라이브러리 추가하는 법은 어디서 알 수 있나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. gradle 추가 하실 때 4줄이나 추가 하시더라구요.//JSP 추가 시작 implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'jakarta.servlet:jakarta.servlet-api' implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api' implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl' //JSP 추가 끝 이렇게 추가해야 한다는 건 어디서 알 수 있나요? jakarta홈페이지를 봐도 영 알 수 가 없어서...MVNRepository에서 찾아도 한 줄 만 추가하는 거 밖에는 안 보이더라구요.
-
미해결스프링 핵심 원리 - 기본편
AppConfig를 스프링 방식으로 전환 후, MemberApp, OrderApp에서 스프링 로그가 출력되지 않습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]AppConfig를 스프링 방식으로 전환 후, 수업에서 보이는 것 처럼 MemberApp, OrderApp에서 스프링 로그가 출력되지 않습니다.[OrderApp 실행화면]자바 버전은 openjdk 21, springframework 버전은 3.2.1 입니다.@Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public static MemoryMemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean public static RateDiscountPolicy discountPolicy() { // return new FixDiscountPolicy(); return new RateDiscountPolicy(); } }public class MemberApp { public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService = applicationContext.getBean("memberService", MemberService.class); Member member = new Member(1L, "memberA", Grade.VIP); memberService.join(member); Member findMember = memberService.findMember(1L); System.out.println("new Member = " + member.getName()); System.out.println("find Member = " + findMember.getName()); } }public class OrderApp { public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService = applicationContext.getBean("memberService", MemberService.class); OrderService orderService = applicationContext.getBean("orderService", OrderService.class); Long memberId = 1L; Member member = new Member(memberId, "memberA", Grade.VIP); memberService.join(member); Order order = orderService.createOrder(memberId, "itemA", 10000); System.out.println("order = " + order); } }
-
해결됨실전! 스프링 데이터 JPA
커스텀 인터페이스 구현체 이름 작성 시 순환 참조 발생 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 영한님. 이번 강의도 잘 수강한 학생입니다.강의 내용과 공식 문서를 참고하며 간단한 게시글 리포지토리를 만들어보고자, 아래처럼 작성했었습니다. public interface BoardRepository { Long save(final Board board); ... }@Repository @RequiredArgsConstructor public class BoardJpaRepositoryImpl implements BoardRepository { private final BoardJpaRepository boardJpaRepository; ... }public interface BoardJpaRepository extends JpaRepository<Board, Long> { }강의 내용대로 스프링 데이터 JPA인 BoardJpaRepository에 Impl을 붙인 BoardJpaRepositoryImpl을 만들었는데, 아래와 같이 순환 참조 문제가 발생했습니다. The dependencies of some of the beans in the application context form a cycle: boardController defined in file [/Users/hyunjoonchoi/Desktop/2024/2024-mju-mentoring/build/classes/java/main/com/mju/mentoring/board/controller/BoardController.class] ↓ boardService defined in file [/Users/hyunjoonchoi/Desktop/2024/2024-mju-mentoring/build/classes/java/main/com/mju/mentoring/board/service/BoardService.class] ┌─────┐ | boardJpaRepositoryImpl defined in file [/..../build/classes/java/main/com/mju/mentoring/board/infrastructure/BoardJpaRepositoryImpl.class] └─────┘ Action: Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true. 그런데 이름을 BoardRepositoryImpl, JpaBoardRepositoryImpl 등 다른 이름으로 하니까 순환 참조 문제가 해결되더라구요이에 대해서 다른 외국 개발자 분들도 이슈로 올리고, 그것들을 찾아봤으나 메인테이너 분이 @Lazy를 사용하거나 ObjectProvider를 사용해야 한다고 말씀해주시는 것 밖에 없었습니다. 공식 문서 (https://docs.spring.io/spring-data/jpa/docs/1.5.0.RELEASE/reference/html/repositories.html#repositories.create-instances)를 보면 스프링 데이터 JPA + Impl로 할 시 자동으로 스프링 데이터 JPA의 구현체로 인식한다고 되어 있는 것 같은데, 이런 순환 참조 이슈가 발생한 원인을 알 수 있을까요? 이를 해결해보고자 스프링 데이터 JPA 레포지토리에 직접 이슈로 남기고 (https://github.com/spring-projects/spring-data-jpa/issues/3320) 답변을 받았긴 했습니다만, 여전히 다른 이야기를 하시는 것 같아 영한 님께도 문의드리고 싶습니다!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@RequestMapping에 대하여
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]1. 스프링 부트를 구동시켜서 톰캣 서버가 띄워지면 HandlerMapping 인터페이스가 애플리케이션 내에 존재하는 핸들러 매핑을 시도하는데 우선적으로 HandlerMapping 인터페이스의 구현체인 RequestMappingHandlerMapping 클래스가 @RequestMapping 어노테이션이 지정된 핸들러를 매핑해서 사용자가 해당 어노테이션으로 지정된 핸들러 중 하나를 요청할 경우 해당 핸들러가 반환되고해당 핸들러에 대한 어댑터를 연결하고 호출하는데 필요한 구현체가 RequestMappingHandlerAdapter 로 이해했는데 맞을까요? 1번의 내용이 맞다면 @RequestMapping을 컨트롤러에 지정할 경우 해당 컨트롤러가 매핑 정보로 활용이 되는데 한 컨트롤러 내에 여러 메서드에 @RequestMapping을 지정할 경우 그 메서드들이 전부 컨트롤러가 되는 것인가요? 그렇다면 메서드들을 정의하고 있는 클래스도 컨트롤러인데 어떤 차이가 있는 건지 궁금합니다 ! 그리고 추가로 컨트롤러는 클래스로 알고있는데 어떻게 메서드 레벨에 @RequestMapping을 지정할 수 있는지도 궁금합니다..
-
미해결스프링부트 시큐리티 & JWT 강의
JWT - 24강 authenticationManager() 문제 해결책
버전 문제로 authenticationManager() 안되면 SecurityConfig @Configuration @RequiredArgsConstructor @EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록된다. public class SecurityConfig { private final CorsConfig corsConfig; // private final CorsFilter corsFilter; // Bean 으로 등록되어 있어서 바로 가져다 써도됨 근데 나는 걍 위에 클래스에서 메소드 호출할거임~ @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); // http.addFilterBefore(new MyFilter3(), SecurityContextHolderFilter.class); http.csrf(CsrfConfigurer::disable); // http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); http.sessionManagement((sessionManagement) -> sessionManagement .sessionCreationPolicy(SessionCreationPolicy.STATELESS)); http.addFilter(corsConfig.corsFilter()); // @CrossOrigin(인증X), 시큐리티 필터에 등록인증(O) // http.formLogin().disable(); http.formLogin((form)-> form.disable()); // http.httpBasic().disable(); http.httpBasic((basic)-> basic.disable()); http.addFilter(new JwtAuthenticationFilter(authenticationManager)); // AuthenticationManger http.authorizeHttpRequests(authorize -> authorize.requestMatchers("/user/**").authenticated() .requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER") .requestMatchers("/admin/**") .hasAnyRole("ADMIN").anyRequest().permitAll()); return http.build(); } } JwtAuthenticationFilter // 스프링 시큐리티에서 UsernamePasswordAuthenticationFilter 가 있음 // /login 요청해서 username, password 전송하면 (post) // UserPasswordAuthenticationFilter가 동작을 함 @RequiredArgsConstructor public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final AuthenticationManager authenticationManager; // /login 요청을 하면 로그인 시도를 위해서 실행되는 함수 @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { System.out.println("로그인 시도: JwtAuthenticationFilter"); return super.attemptAuthentication(request, response); } }
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
MyBatis 적용2에서 오류가 발생합니다.
MyBatis 버전도 낮춰보고 코드도 비교해보고 했는데 자꾸 Invalid bound statement오류가 발생합니다. 혹시 어떤 게 문제일까요.. 제가 잘 못 찾는 건가요..? 코드 : https://drive.google.com/file/d/14j1mBlyOWm9aELoBGtqbPQ6AAwla6DX5/view?usp=drive_link
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Enumerated와 hibernate 타입 검증 관련 해결을 어떻게 해야할지 모르겠습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 안녕하세요 강의에서 설명해주신 대로 따라하려고 했습니다.단 , ddl-auto : create 대신 미리 SQL 문으로 테이블을 생성해놓고 ddl-auto: validate로 실행시 에러가 납니다. 이는 실제로 배운 것을 사용할 수 없는 아주 치명적인 부분이라고 생각하여 질문을 드립니다. [문제 설명]강의에서 설명해주신대로 위와 같이 Enumerated 를 사용하여 status 를 정의 하였습니다.말씀해주신대로 value = EnumType.STRING을 사용했습니다.UserStatus 는 당연히 enum 타입으로 했구요.@Column(name = "status", length = 32) @Enumerated(value = EnumType.STRING) private UserStatus status;이때 status 가 있는 테이블은 아래와 같은 SQL문으로 생성하였습니다.VARCHAR(255)로 생성한 점을 자세히 봐주세요!dbms: MySQLCREATE TABLE user ( `id` BIGINT NOT NULL AUTO_INCREMENT, `status` VARCHAR(255) NOT NULL check (status in ('CREATED', 'WITHDRAW')), PRIMARY KEY (id) ); 또한 application-yml 에는 아래와 같이 ddl-auto 를 validate 로 하였습니다.jpa: hibernate: ddl-auto: validate properties: hibernate: format_sql: true show-sql: true 하지만 이를 실행하면 아래와 같은 status의 타입 오류 에러가 나옵니다.Schema-validation: wrong column type encountered in column [status] in table [user]; found [varchar (Types#VARCHAR)], but expecting [enum ('created','withdraw') (Types#ENUM)]이는 db의 status 의 타입이 enum 이길 기대했지만 실제로는 VARCHAR이기 때문에 에러가 발생한다는 것입니다. (ddl-auto의 validate에 의해 검증 수행)MySQL에서 타입에 enum을 적용하면 해결되지만 쓰는 것을 최대한 지양해야 한다고 알고 있습니다.따라서 mysql 의 status 컬럼의 타입을 enum 대신 column 타입을 varchar(255)로 두고 사용하려고하는데 위와 같은 에러가 나서 실행이 되지 않습니다.ddl-auto : none 으로 설정하면 임시적으로 실행은 할 수 있지만 validate 로 검증을 항상 진행하려고 합니다. [질문 내용]1. mysql의 타입을 varchar로 두고, ddl-auto: validate 를 사용하면서 에러 없이 실행할 수 있는 방법이 궁금합니다.2. ddl-auto : create로 하게 되면 자동 생성되는 sql문에서는 status에 enum 대신 create table user (id bigint not null,status varchar(255) check (status in ('CREATED', 'WITHDRAW')),primary key (id))위처럼 varchar로 column 속성을 주면서 validate 할때만 에러가 나는것이 이상한 것 같은데 왜 그럴까요?3. 이를 현업에서는 어떻게 해결하고 계신지 궁금합니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ModelView 객체 여러개 생성
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]MemberSaveControllerV3와 MemberListControllerV3에서 process 메서드가 실행될 때마다 새로운 ModelView객체를 생성하는데, 해당 컨트롤러로 들어오는 url은 같으므로 이를 싱글톤으로 만들면 메모리 관점에서 더 좋은것 아닌가요? 이를 따로 고려하시지 않은건지 아니면 다른 이유가 있는지 궁금합니다!
-
미해결스프링부트 시큐리티 & JWT 강의
코틀린 시큐리티 컨피그 설정방법 참고하세요
코틀린에서 이번강의 설정할땐 import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity import org.springframework.security.config.annotation.web.configurers.CsrfConfigurer import org.springframework.security.web.SecurityFilterChain @Configuration @EnableWebSecurity class SecurityConfig { @Bean fun filterChain(http:HttpSecurity):SecurityFilterChain{ http.csrf(CsrfConfigurer<HttpSecurity>::disable) http.authorizeHttpRequests{ it.requestMatchers("/user/**").authenticated() it.requestMatchers("/manager/**").hasAnyRole("MANAGER","ADMIN") it.requestMatchers("/admin/**").hasRole("ADMIN") it.anyRequest().permitAll() } http.formLogin{ it.loginPage("/login") it.permitAll() } return http.build() } } 이런식으로 하시면됩니다WebSecurityConfigurerAdapter는 사라졌고 대신 빈을 생성해서 등록하는식으로 바뀐거같고기본적으로 직렬로 메서드체이닝하던게 다 람다식으로 빠졌고(자기자신을 설정하는건 다 내부람다식으로 동작하게 바뀐듯)authorizeRequests->authorizeHttpRequestsantMatcher->requestMatchersand().formLogin()->http.formLogin{...}이렇게 이름이 변경된친구들도 있습니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
405오류
8080/hello로 가면 왜 405오류가 나는건가요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
MyBatis 적용시 오류
질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]저와 같은 내용의 질문이 있어서 참고해 봤는데도 해결이 안되어 질문드립니다.<MyBatis 적용2 - 설정과 실행 부분 테스트 오류>MyBatis 적용 후 테스트코드 돌려보았는데, Bean설정과 관련된 오류가 나타납니다. 패키지 Path도 확인해보고, 교재와 비교도 해보았는데 어떤 문제인지 잘 모르겠습니다ㅠㅠ테스트 돌렸을때 아래와 같은 오류가 납니다.Parameter 0 of constructor in hello.itemservice.config.MyBatisConfig required a bean of type 'hello.itemservice.repository.mybatis.ItemMapper' that could not be found.Action:Consider defining a bean of type 'hello.itemservice.repository.mybatis.ItemMapper' in your configuration. 구글드라이브 링크 첨부드립니다!https://drive.google.com/file/d/1U8YIKxbUDMvnv2ZaWjzB5gUTgqcwTZ-t/view?usp=sharing
-
해결됨Practical Testing: 실용적인 테스트 가이드
ServiceRequestDto 대신 풀어서 넘기는건 어떻게 생각하시나요?
Controller단의 Dto를 Service 전용 Dto로 변환해서 넘기는 방법을 알려주셨는데Controller단에서 받은 Dto의 컬럼들을 모두 풀어서 Service단 으로 넘겨주는 방법은 어떻게 생각하시는지 궁금합니다.이렇게 하면 순수한 자바코드로 Service단 코드를 작성할 수 있을 거라고 생각하는데 강사님의 생각 알려주시면 감사하겠습니다.
-
미해결스프링 시큐리티 OAuth2
26:30 경에 userinfo 분기가 강사님과 다릅니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. OicdUserService의 아래 메서드에서 true를 반환해버리는데요. 우선 해당 함수의 if(authroization_code 이냐?) 분기를 타고, accessibleScopes가 empty 가 아닙니다. 아마 키클록에서 default 스코프가 있기 때문인거 같은데요. shouldRetrieveUserInfo 해당 영상에서는 키클록의 default 스코프가 빠진걸까요? 아니면 grant type 문제일까요? 참고로 grant type 은 별다른 옵션 없이도, registration repository에서 꺼내오는 순간 registration에는 authroization_code 입니다.
-
해결됨스프링 핵심 원리 - 기본편
의존성에 대해 궁금한것이있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 보면 9분에 FixDiscountPolicy가 DIscountPolicy를 의존하고 있다고하는데 제가 알고있는 의존은 A클래스에서 B클래스를 new 로 생성하면 A가 B를 의존한다라고 알고있는데 인터페이스를 구현한 구현 객체도 의존한다고하니까 잘모르겠네요
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컬렉션 fetch join
안녕하세요 강사님프로젝트 중 궁금한 점이 있어 질문드립니다..!6개의 엔티티를 조인해야 하는 상황인데 현업에서도 이렇게 조인을 하기도 하나요? 물론 성능에 따라 다르겠지만 몇개 정도의 테이블을 조인하는 것이 적당할까요?컬렉션 패치 조인은 1개까지만 하라고 하셨는데 현재 상황은 3개나 컬렉션이 존재합니다. 이런경우는 어떤식으로 해결하는게 좋을까요?? 강사님께서는 어떤식으로 해결하시는지 궁금합니다 ㅎㅎ감사합니다!
-
미해결스프링 핵심 원리 - 기본편
빈 이름으로 조회 x
[질문 내용]여기에 질문 내용을 남겨주세요. @Test @DisplayName("빈 이름으로 조회X") void findBeanByName_X() { // MemberService memberService = ac.getBean("xxxxx", MemberService.class); assertThrows(NoSuchBeanDefinitionException.class, () -> ac.getBean("xxxxx", MemberService.class)); } }이 코드에서 주석을 제거하면 여전히 NoSuchBeanDefinitionException이 발생하는데 이는 주석 코드에서 오류가 생겨서 더이상 진행되지 않기때문에 assertThrows코드가 실행되지 않은것인가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
H2 DB 테스트 코드 실행시 무한 로딩 연결 안됨
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.테스트 코드 실행시 무한 로딩 미해결 3일차 해결 방법이 필요합니다.package hello.jdbc.connection; public abstract class ConnectionConst { public static final String URL = "jdbc:h2:tcp://localhost/~/study/test"; public static final String USERNAME = "sa"; public static final String PASSWORD = "1318!"; }
-
미해결스프링 부트 - 핵심 원리와 활용
AppInitV2Spring 오류 및 AppInitV3SpringMvc 미동작 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]"스프링 컨테이너 등록" 강의에서 작성하는 코드HelloConfig, HelloController, AppInitV2Spring 이렇게 작성하게 되는데요. 무료버전의 톰캣 설정 문제가 아니라는 것은 이전 강의 V1까지는 제대로 실행이 완료된 상태입니다.그래서 V1까지는 잘 되었으나 AppInitV2Spring 코드를 작성하고 빌드하면IllegalStateException: 자식 컨테이너를 시작하는 중 오류 발생 -> caused by LifecycleException: 구성요소[StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]을(를) 시작하지 못했습니다.-> caused by java.lang.NoClassDefFoundError-> ClassNotFoundException 형태로 오류가 뜹니다.자세한 오류는 맨 아래 첨부합니다. 신기한건 기존에 war 파일 형태로 빌드($gradlew build)하여tomcat/libs/webapps에 ROOT.war 로 올리고 톰캣을 별도로 실행한다음에localhost:8080/spring/hello-spring주소를 입력하고 테스트 할 때는 잘뜨니까 미치겠습니다. ..ㅜㅜ 오류가 나니 AppInitV2Spring 내용은 주석처리하고 다음강의인 AppInitV3SpringMvc를 작성했는데요. 해당 onStartup()은 호출부터 안되네요... "AppInitV3SpringMvc.onStartup" 부터 로그가 안찍힙니다..이것 역시 혹시나...? 하고 war파일로 빌드하여 톰캣 webapps에 넣고 직접 톰캣 실행 후 localhost:8080/hello-springlocalhost:8080/spring/hello-spring.. 전부 잘됩니다.... ㅠㅠ MyContainerInitV1.onStartup MyContainerInitV1 c = null MyContainerInitV1 ctx = org.apache.catalina.core.ApplicationContextFacade@5a411614 MyContainerInitV2.onStartup MyContainerInitV2 c = [class hello.container.AppInitV1Servlet, class hello.container.AppInitV2Spring] MyContainerInitV2 ctx = org.apache.catalina.core.ApplicationContextFacade@5a411614 AppInitV1Servlet.onStartup 10-Jan-2024 19:59:26.303 SEVERE [main] org.apache.catalina.startup.HostConfig.deployDescriptor 배치 descriptor [C:\Users\oksu\.SmartTomcat\server\server\conf\Catalina\localhost\ROOT.xml]을(를) 배치하는 중 오류 발생 java.lang.IllegalStateException: 자식 컨테이너를 시작하는 중 오류 발생 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:686) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:712) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:643) at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1939) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123) at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:536) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:426) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1661) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:114) at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402) at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:345) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:893) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:845) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:240) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:433) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:917) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.startup.Catalina.start(Catalina.java:795) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:347) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478) Caused by: org.apache.catalina.LifecycleException: 구성요소 [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]을(를) 시작하지 못했습니다. at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:419) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:186) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683) ... 37 more Caused by: java.lang.NoClassDefFoundError: org/springframework/web/context/WebApplicationContext at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3373) at java.base/java.lang.Class.getConstructor0(Class.java:3578) at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2754) at hello.container.MyContainerInitV2.onStartup(MyContainerInitV2.java:22) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4850) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) ... 38 more Caused by: java.lang.ClassNotFoundException: org.springframework.web.context.WebApplicationContext at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1353) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165) ... 45 more 10-Jan-2024 19:59:26.312 INFO [main] org.apache.catalina.startup.HostConfig.deployDescriptor 배치 descriptor [C:\Users\oksu\.SmartTomcat\server\server\conf\Catalina\localhost\ROOT.xml]의 배치가 [747] 밀리초 내에 완료되었습니다. 10-Jan-2024 19:59:26.315 INFO [main] org.apache.coyote.AbstractProtocol.start 프로토콜 핸들러 ["http-nio-8080"]을(를) 시작합니다. 10-Jan-2024 19:59:26.491 INFO [main] org.apache.catalina.startup.Catalina.start 서버가 [996] 밀리초 내에 시작되었습니다. http://localhost:8080/ 10-Jan-2024 20:02:05.720 INFO [Thread-1] org.apache.coyote.AbstractProtocol.pause 프로토콜 핸들러 ["http-nio-8080"]을(를) 일시 정지 중 10-Jan-2024 20:02:05.748 INFO [Thread-1] org.apache.catalina.core.StandardService.stopInternal 서비스 [Catalina]을(를) 중지시킵니다. 10-Jan-2024 20:02:05.749 INFO [Thread-1] org.apache.coyote.AbstractProtocol.stop 프로토콜 핸들러 ["http-nio-8080"]을(를) 중지시킵니다. 10-Jan-2024 20:02:05.755 INFO [Thread-1] org.apache.coyote.AbstractProtocol.destroy 프로토콜 핸들러 ["http-nio-8080"]을(를) 소멸시킵니다.
-
미해결실전! 스프링 데이터 JPA
2024년 1월 기준 p6spy dependency 추가
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' 1.9.0으로 바꾸시면 나올겁니다!