묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨토비의 스프링 부트 - 이해와 원리
[스프링 컨테이너 사용] 강의 중 getBean IDE 상 에러가 뜨는데 원래 그럴까요 ?
cannot acess 에러가 발생하는데,실제, 코드를 돌리면 컴파일 및 런타임 에러 없이 동작합니다.Access 에러 길래, 접근 제어자 문제로 판단하였으나, 전부 Public 이라 딱히 문제도 없는것 같은데, 저만 그런건지 궁금합니다.registerBean 에서도 해당 클래스를 불러오기 때문에, 여기서도 에러가 뜬다면 이해하겠으나..해당 부분은 문제없고.. 밑에서만 떠서... 궁금합니다[참고로, 실행하면 컴파일 에러 없이 실행 되고... IDE 상에서는 에러로 계속 남아 있습니다. ] package com.example.helloboot; import org.apache.catalina.startup.Tomcat; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServer; import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.context.support.GenericApplicationContext; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class HellobootApplication { public static void main(String[] args) { // Spring Container 생성 Context 가 Container 임 // 컨테이너 생성 GenericApplicationContext applicationContext = new GenericApplicationContext(); // 오브젝트 (빈) 등록 applicationContext.registerBean(HelloController.class); // 오브젝트 생성 요청 applicationContext.refresh(); // [Step 1] Servlet 컨테이너 생성 // Factory 생성과 설정 작업등을 대신 해주는 대상 TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory(); WebServer webServer = serverFactory.getWebServer(servletContext -> { servletContext.addServlet("frontcontroller", new HttpServlet() { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 인증, 보안 , 다국어, 공통 기능 등 처리 if (req.getRequestURI().equals("/hello") && req.getMethod().equals(HttpMethod.GET.name())) { String name = req.getParameter("name"); // binding 데이터를 처리하는 오브젝트에 데이터를 넘기는 것 HelloController helloController = applicationContext.getBean(HelloController.class); String ret = helloController.hello(name); resp.setContentType(MediaType.TEXT_PLAIN_VALUE); resp.getWriter().println(ret); } else { resp.setStatus(HttpStatus.NOT_FOUND.value()); } } }).addMapping("/*"); }); webServer.start(); } }
-
해결됨토비의 스프링 부트 - 이해와 원리
부트 3.0 사용하시는 분들은 @RequestMapping 만으로 매핑이 등록되지 않으니 참고하세요.
부트 3.0과 스프링 6.0이전 버전에서는 매핑 테이블에 핸들러로 등록되기 위해서는 클래스 레벨의 @RequestMapping 어노테이션만으로 가능했으나, 3.0부터는 클래스 레벨의 핸들러 감지 대상에 @Controller 어노테이션만이 포함된다고 합니다.https://github.com/spring-projects/spring-framework/issues/22154
-
해결됨토비의 스프링 부트 - 이해와 원리
토비님이 생각하시는 단위 테스트, 통합 테스트의 범위를 알려주실 수 있으신가요?
강의에서 말씀하신대로, 단위테스트 혹은 통합테스트와 같은 용어들이 단어가 느슨하게 정의되어 있어 블로그, 책, 강의마다 설명들이 다 달라서 면접 같은 곳에서 질문을 받으면 매우 곤란한데요. 단위 테스트, 통합 테스트 범위? 정의? 같은 것에 대한 토비님의 개인적인 의견 혹은 기준이 궁금합니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
복잡한 decorator 예제
안녕하세요 토비님! 강의를 듣는 중에, 여러개의 데코레이터를 우선순위를 정하는 방법 말고 원하는 상황에 맞게 주입이 되도록 처리하는 방식에 대해 말씀해주셨는데, 해당 방법에 대해 좀더 자세하게 알고 싶어져서 사용하는 예제 코드를 구글링 해보았지만 못찾겠어서 질문 올립니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
`@ConditionalOnClass` 관련 문의
안녕하세요! 강의에서 한가지 궁금한 점이 있어서 질문드립니다!@ConditionalOnClass 어노테이션에서 XmlMapper.class 는 빨간 줄로 나와서 찾아보니import com.fasterxml.jackson.dataformat.xml.XmlMapper;가 resolve 되지 못하는 것으로 추측되었습니다. 이런 경우는 빌드가 되지 않아야 하는 것이 아닌가 싶어서 제가 무엇을 놓치고 있는 것인지 알고 싶어 문의드립니다
-
해결됨토비의 스프링 부트 - 이해와 원리
공부 방법에 대해서 질문드립니다.
안녕하세요. 토비님저는 이제 곧 4년차가 되가는 개발자 입니다.토비님의 스프링 부트 강의가 나온다는 이야기를 듣고 바로 구매 후 강의를 듣고 있는데 진짜 너무 좋은 내용에 무한 반복을 하고 있으며, 이전에 토비님이 쓰신 토비의 스프링 3.1을 이전에 완독을 해볼려고 하다가, 도중에 다른 일 때문에 중단을 했었는데 요번에 다시 한번 읽어볼려고 합니다.평소 토비님처럼 개발자로서, 전문가가 되고 싶다는 생각을 항상 하고 있는데, 토비님께서는 어떻게 스프링이나 다른 기술들을 공부를 하시는지, 궁금합니다. 그리고 토비님께서 생각하시는 스프링 개발자라면 꼭 기본적으로 꼭 알아야 될 필수 기술이 어떤 건지도 궁금합니다.어떻게 토비님께서 기술 공부를 하시는지, 비법을 알려주신다면 정말 열심히 해보겠습니다!정말 좋은 강의를 내주셔서 감사합니다.다음 강의 기다리고 있습니다!!ㅎㅎ
-
해결됨토비의 스프링 부트 - 이해와 원리
imports 파일을 읽어오지 못하는 오류
안녕하세요!이번에 스프링부트를 수강하게 된 학생입니다.퀄리티 높은 수업을 제공해주셔서 감사합니다!다름이 아니라 "자동 구성 정보 파일 분리" 파트를 수강하던 중imports 파일을 생성하여 class 정보를 불러오는 부분에서 오류가 발생하여 질문글 남깁니다.MyAutoConfigImportSelector.java에서 selectImports 메소드를 사용할 때리턴 해주는 String 배열을 직접 입력해주는 아래와 같은 방법을 사용하여 작성했을 때는 서버가 정상적으로 실행되었습니다.return new String[] { "tobyspring.config.autoconfig.DispatcherServletConfig", "tobyspring.config.autoconfig.TomcatWebServerConfig" };그런데 classLoader를 사용하여 META-INF 하위에 생성한 imports 파일을 읽어오는 코드를 작성하여 실행하니 ServletWebServerFactory 빈을 찾을 수 없다는 오류가 발생하며 서버가 정상적으로 실행되지 않습니다...혹시 META-INF를 읽어오지 못하는 이유가 있을까요??
-
미해결토비의 스프링 부트 - 이해와 원리
kotlin에서 registerBean 컴파일 에러 해결법
kotlin으로 toby님의 강의를 따라다가다 안되는 부분이 발생하여 다른분들도 해결하시면 좋을 것 같아 공유차원에서 글 남깁니다! org.springframwork.context.support.registerBean을 impot하여 해결할 수 있습니다.관련 docs:https://docs.spring.io/spring-framework/docs/5.0.0.RELEASE/spring-framework-reference/kotlin.html import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory import org.springframework.boot.web.server.WebServer import org.springframework.boot.web.servlet.ServletContextInitializer import org.springframework.context.support.GenericApplicationContext import org.springframework.context.support.registerBean import org.springframework.http.HttpHeaders import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus import org.springframework.http.MediaType import javax.servlet.http.HttpServlet import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse class HellobootApplication fun main(args: Array<String>) { val myApplicationContext = ApplicationContext() myApplicationContext.registerSpringBean() val serverFactory: TomcatServletWebServerFactory = TomcatServletWebServerFactory() val webServer: WebServer = serverFactory.getWebServer( ServletContextInitializer { it.addServlet("frontController", FrontController::class.java) .addMapping("/*") } ) webServer.start() } class ApplicationContext{ fun getContext() = springApplicationContext fun registerSpringBean(){ springApplicationContext.apply{ registerBean<HelloController>() refresh() } } companion object{ val springApplicationContext: GenericApplicationContext = GenericApplicationContext() } } class FrontController: HttpServlet() { override fun service(request: HttpServletRequest?, response: HttpServletResponse?) { requireNotNull(request) requireNotNull(response) val springApplicationContext = ApplicationContext().getContext() val helloController = springApplicationContext.getBean(HelloController::class.java) //인증, 보안, 다국어, 공통 기능 처리 duplicateCode() if(request.requestURI == "/hello" && request.method == HttpMethod.GET.name ){ val name = request.getParameter("name") response.status = HttpStatus.OK.value() response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE) response.writer.println(helloController.hello(name)) }else { response.status = HttpStatus.NOT_FOUND.value() } } } private fun duplicateCode(){}
-
해결됨토비의 스프링 부트 - 이해와 원리
스프링의 미래 질문
좋은강의 너무 감사드립니다.혹시 스프링 관련해서 여쭤보고 싶은게 있습니다.점점 더 Cloud 환경으로 가면서 SpringBoot 이외에 더 빨리 개발, 배포 할 수 있는Spring Quakers 라던가 micronaut 같은 프레임 워크들이 등장했는데업력, Spring 경력이 높으신 선배님으로서 위와 같은 프레임워크들이 추후에 더 성장해서Boot 만큼 많이 쓰이게 될 수 있을거라고 생각하시나요? 아니면 조금 반짝 하다가 Spring 진영이 더욱 발전해서 더 빠른 개발, 성능을 커버 할거라고 보시나요? 궁금합니다.앗 그리고 + GraalVm 의 미래도 궁금합니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
로그 파라미터에 관한 질문입니다
파라미터가 masked 로 가려져 보이는데 정확하게 파라미터가 넘어오는지 확인을 해보고 싶습니다.그래서 스프링부트 공식문서에 설정관련 페이지를 보고 있는데 잘 찾아지지가 않아 질문드립니다. 검색할 키워드를 알 수 있을까요?spring.mvc.log-request-details=true찾아보던 중 위 설정을 적어주면 파라미터가 제대로 보인다고 하는데 이것도 적용이 되질 않습니다ㅠㅠ
-
해결됨토비의 스프링 부트 - 이해와 원리
강의자료 압축이 안풀립니다,,
윈도우환경이구요, 이름변경해서 압축을 풀려고해도 안되네요 ㅠㅠ
-
해결됨토비의 스프링 부트 - 이해와 원리
TestRestTemplate로 테스트 하는데 403 FORBIDDEN이 응답으로 옵니다.
문제가 되는 코드입니다. 브라우저에서는 200 응답이 정상적으로 오는데 테스트 코드에서만 이런 문제가 생깁니다. 의심가는 부분은 user-agent인데 헤더를 설정해주는 부분이 TestRestTemplate에는 없어서 다른 해결 방법이 있는지 질문드립니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
블로그에 강의 내용을 정리해서 올려도 괜찮을까요?
안녕하세요. 수업 흥미롭게 듣고 있는 수강생 입니다.블로그에 공부한 내용을 정리해두는걸 좋아합니다. (예시) 토비님의 강의도 아래처럼 강의를 정리하면서 듣고 있는데 혹시 블로그(광고 안붙인 블로그입니다.)에 아래와 같이 메모한 강의 내용을 올려도 괜찮을지 문의드립니다. 주로 강의 따라서 작성한 코드 스샷 및 말하신 내용 중 기억할만한 부분들이나 전체적인 흐름을 적었습니다. (나중에 제가 보고 기억날 수 있게요)가능하시다면 혹시 일부 강의 스샷도 올려도 되는지 궁금합니다(특히 현재까지의 코드 구조 중간중간 설명해주신 부분이나 초반에 Containerless 설명해주신 부분이요! 물론 몇장만요.)
-
해결됨토비의 스프링 부트 - 이해와 원리
@ComponentScan 에 대해서
@Component를 사용하기 위해서는 @ComponentScan을 사용하는데 더 나아가 @component가 메타 어노테이션으로 쓰이는 @Service나 @Controller 같은 경우는 @ComponentScan없이 동작이 되는데요. 내부적으로는 @Component 어노테이션을 사용해 @ComponentScan이 필요하지 않을까 했는데 없어도 동작이 되는것 같은데요.이는 동작이 다른건가요?
-
해결됨토비의 스프링 부트 - 이해와 원리
Dependency Injection 부분 질문
토비님 질문이 있습니다.디자인 패턴이며 oop며 다들 지향하는게 추상화에 의존하라 즉 인터페이스에 의존하는 내용이 많은데요그 부분을 스프링 빈 사이의 의존성에 연관을 지으니까 조금 의아한 부분이 있더라구요이 회차 강좌에서 말씀해주신거 처럼HelloController가 인터페이스(HelloService)를 의존한다고 해도결국에는 런타임시 SimpleHelloService에 의존적인거죠?만약 런타임시 CompleHelloService에 의존으로 하려면 결국에는 HelloController 소스를 수정해야하는거죠?
-
해결됨토비의 스프링 부트 - 이해와 원리
테스트 코드 작성시 저와 같은 에러를 만나신분 없을까요
중간에 빼먹은 코드는 없는거 같은데 뭐가 문제인지 모르겠습니다..
-
해결됨토비의 스프링 부트 - 이해와 원리
DI를 이용한 Proxy패턴 관련 질문
DI를 이용한 Decorator, Proxy 패턴 듣고있는데요. 강의자료에 프록시 패턴의 프록시와 일반적용 용어 프록시, 자바의 다이나믹 프록시가 동일한 건 아니다. 이게 혹시 어떤내용인지 좀 더 알 수 있을까요?
-
해결됨토비의 스프링 부트 - 이해와 원리
Springboot version(start.spring.io)
https://start.spring.io/현재는 2.7.6은 보이지 않아, 우선 인텔리제이에서의 프로젝트 생성 마법사로 설정하거나, springboot cli로 설치해야 할 것 같아 공유드립니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
디스코드 초대장이 만료되었다고합니다
공유주신 디스코드 서버 초대장이 만료되었다고해요 https://discord.gg/4VUfPddk
-
해결됨토비의 스프링 부트 - 이해와 원리
zsh: command not found: http
인텔리제이 터미널에서 http 명령어 입력 시 http 명령을 인식 못하는데 사전 설정해줘야 할 게 있을까요?