인프런145 6)스프링 MVC (구조이해),핸들러 매핑과 핸들러 어댑터,뷰 리졸버 Spring MVC (구조 이해) 이전 시간에 직접만든 MVC 프레임워크랑 실제 스프링 MVC를 비교해보자. Spring MVC 구조 FrontController -> Dispatcher Servlet 직접 MVC 프레임워크를 만들때 프론트 컨트롤러는 서블릿으로 만들었다. 서블릿의 urlPatterns(어떤 url을 받을것인지)로 * 기호를 이용하여 원하는 http요청들을 다 받아냈고, 요청에 대해 핸들러를 조회해서 찾아오고, 핸들러 처리할 어댑터도 조회해오고 하면서 진행했다. Spring MVC에서는 Dispatcher Servlet으로 이름만 다르고 하는일은 동일하다. (사전적의미 Dispatch -> 보내다(파견보내다) ,Dispatcher 보내고,배치하는것을 관리하는사람 즉 Dispatcher S.. 인프런/스프링 MVC 1편 2023. 1. 18. 5)MVC 프레임워크 만들어보기(리팩토링하면서 버전업 v1~v5) MVC 프레임워크를 단계적으로 업그레이드 시켜보면서 만들어볼것이다. 결국 끝까지 업그레이드를 하게 되면 Spring MVC와 유사한 구조가 될것이다. 직접 MVC프레임워크를 만들어보고, 업그레이드해보면 나중에 Spring MVC를 배울때 좀더 쉽게 이해할수 있을것이다. 프론트 컨트롤러 소개 이전 강의때 서블릿을 이용해서 컨트롤러를 만들었다. 그때는 http 요청마다 컨트롤러를 만들어줘야했고, 그래서 공통적으로 들어가는 코드가 반복되었다. 프론트컨트롤러를 도입하면 프론트컨트롤러에 공동로직을 몰아두고 프론트컨트롤러를 통해 나머지 컨트롤러로 이동하게끔한다. (프론트 컨트롤러만 서블릿이다.(요청을 받아야하니까), 나머지 컨트롤러는 서블릿을 사용하지않아도 된다.( 요청을 받을 필요가없으니까)) 프론트 컨트롤러 도.. 인프런/스프링 MVC 1편 2023. 1. 17. 4)서블릿,JSP,MVC패턴 적용 서블릿으로 간단한 회원관리 웹어플리케이션을 만들것이다. 그다음은 JSP, 그다음은 MVC패턴으로 만들어볼것이다. 어떤 불편한점이 있어서 MVC패턴이 탄생했는지 알아보고 MVC패턴에 대해 공부해보자. 회원이라는 엔티티 == 도메인모델을 만들어준다. Member.java @Getter @Setter public class Member { private Long id; private String username; private int age; public Member() { // 아무것도 받지않는 기본생성자도 만들어준다. } public Member(String username, int age) {//생성자로 이름과 나이를 받는 생성자를 만들어준다 this.username = username; this.age.. 인프런/스프링 MVC 1편 2023. 1. 16. 3)HttpServletRequest,HttpServletResponse Host~ Content-Type 부분이 헤더정보 HttpServeletRequest 객체는 http요청메시지를 편리하게 읽어들이는 기능에다가 부가기능을 제공한다. HttpServletRequest - 기본 사용법 http요청메시지 첫번째 라인에 나오는 정보들, HttpServletRequest객체를 이용하여 가져오기 @WebServlet(name = "requestHeaderServlet",urlPatterns = "/request-header") public class RequestHeaderServlet extends HttpServlet { //헤더정보관련해서 공부용 서블릿 @Override protected void service(HttpServletRequest request, HttpServ.. 인프런/스프링 MVC 1편 2023. 1. 15. 2)서블릿,서블릿컨테이너 일반적으로 Jar지만 JSP공부를 하기위해 이 프로젝트는 War를 선택한다. generate해서 프로젝트 파일받아서 인텔리제이로 열어주고 plugin에서 롬복이 깔려있는지 체크하고 , build시 실행이 gradle로 되는것을 인텔리제이로 바꿔주고, 어노테이션 처리가 잘되게끔 체크해줘야한다. 서블릿을 등록하고 사용해보자. 스프링 부트 서블릿 환경 구성 @ServletComponentScan //서블릿 자동등록 어노테이션, 자동빈등록에 쓰는 @ComponentScan과 같이 , 현재 패키지이하를 모두 뒤져서 서블릿을 찾아, 등록시켜준다. @SpringBootApplication public class ServletApplication { public static void main(String[] args).. 인프런/스프링 MVC 1편 2023. 1. 13. 1)웹서버,웹 어플리케이션 서버,웹 시스템 구성,서블릿,멀티스레드,서버사이드 렌더링,서버 사이드 렌더링 HTTP란? 클라이언트에서 서버로, 서버에서 클라이언트로 데이터를 전송할때 http라는 프로토콜기반으로 동작한다. 그래서 대부분의 데이터는 http기반으로 주고 받는다. 웹 서버(Web Server) 정적 리소스 => 정적 html,css,js,이미지,영상과 같은것들 http 요청이 오면 , 정적 리소스 같은 html데이터를 응답해주는 서버 웹 어플리케이션 서버(WAS - Web Application Server) 웹서버는 정적으로 보여주기때문에 , 특정 사용자마다 다른것을 보여주거나 그런걸 할 수없다. 하지만 웹어플리케이션 서버(was)는 프로그램 코드를 실행해서 어플리케이션 로직을 수행하기 때문에 사용자에 따라서 다른걸 보여줄 수 있다. 웹서버는 정적리소스를 웹 어플리케이션서버(was)는 어플리케이션.. 인프런/스프링 MVC 1편 2023. 1. 13. 1)프로젝트생성,설정, 테스트 https://start.spring.io/ 롬복설치 시 주의사항 View 환경설정타임리프는 라이브러리 설치만하면 스프링부트가 알아서 환경설정 다 해준다. 타임리프 동작확인하기 HelloController@Controllerpublic class HelloController { @GetMapping("hello") //@GetMapping은 @RequestMapping(method = RequestMethod.GET)라는 어노테이션을 포함하고있다, hello라는 request가 들어오면 아래 메소드실행 public String hello(Model model) { //모델이라는것에 데이터를 실어서 뷰에 넘길수있다. model.addAttribute("data","hello!!").. 인프런/실전! 스프링부트와 JPA활용1 2023. 1. 12. 끝)bean 생명주기 콜백 3가지방법,빈 스코프,웹 스코프,스코프와 프록시 인터페이스 InitializingBean, DisposableBean 방법 NetworkClient 수정 public class NetworkClient implements InitializingBean, DisposableBean { //InitializingBean 구현 -> 초기화 콜백관련 DisposableBean 소멸 콜백관련 private String url; public NetworkClient() { System.out.println("생성자 호출, url = " + url); } public void setUrl(String url) { this.url = url; } //서비스 시작시 호출 public void connect() { System.out.println("connect : .. 인프런/스프링핵심원리(기본) 2023. 1. 11. 16 ★★★ (의존관계주입시)조회한 빈이 모두 필요할때, (의존관계주입)자동, 수동의 올바른 실무 운영 기준 , 빈 생명주기 콜백 조회한 빈이 모두 필요할때 List , Map 실무적 예를 들면) 할인 서비스를 제공하는데 클라이언트가 할인의 종류를 선택할 수 있을때를 가정해보자. 스프링을 사용하면 소위 말하는 전략패턴을 매우 간단하게 구현할 수 있다. 빈들 Map,List로 가져오기 테스트 public class AllBeanTest { @Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); //전달인자로 넣은것은 빈으로 등록된다.(DiscountService는 스프링컨테이너 생성할때 전달인자로 넣어서 직접 빈 등록해준거다.) // 전달인자 클래스중.. 인프런/스프링핵심원리(기본) 2022. 12. 30. 15) ★★★ 다양한 의존관계 주입방법,옵션처리,생성자 주입 선택,final 키워드,롬복과 최신 키워드, 조회할 빈이 2개이상(문제발생)(@Autowired,@Qualfier,@Primary), 어노테이션 직접 만들기 의존관계 주입은 크게 4가지 방법이 있다. 1. 생성자 주입 2. 수정자 주입(== setter 주입) 3. 필드 주입 4. 일반 메서드 주입 생성자 주입 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this... 인프런/스프링핵심원리(기본) 2022. 12. 28. 14)★★★컴포넌트 스캔과 의존관계 자동주입(@ComponentScan,@Autowired), 탐색위치와 기본 스캔 대상(@Service~) , 스캔필터링 , 중복 등록과 충돌 AppConfig라는 구성설정 파일을 만들어서 스프링빈을 등록했고 등록하는 과정에서 자동으로 의존관계도 주입되었다. 하지만 등록해야하는 스프링빈이 많아지면 설정 정보도 커지고 누락하는 문제가 발생한다. ( + 귀찮음) 그래서 스프링에서는 설정정보 없이 자동으로 스프링 빈을 등록하는 컴포넌트 스캔을 제공한다. 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다. 공부를 위해 원래있던 AppConfig는 냅두고 새로 AutoAppConfig를 생성한다. @ComponentScan을 사용하면 @Component 어노테이션이 붙은 모든 클래스를 찾아서 자동으로 스프링빈으로 등록해준다. AutoAppConfig.java @Configuration // 설정정보 파일이니까 @Configuration.. 인프런/스프링핵심원리(기본) 2022. 12. 28. 13)★★싱글톤이 필요한 이유,싱글톤 패턴, 싱글톤 컨테이너,싱글톤 방식의 주의점 ,@Configuration과 싱글톤,@Configuration과 바이트코드 조작의 마법,@Configuration의 역할 웹 어플리케이션과 싱글톤이 필요한 이유 보통 여러 클라이언트가 동시에 요청을 하게된다. DI 컨테이너 (의존성 주입 컨테이너) ==> 우리가 만든 AppConfig 만약에 스프링이 없다면 위의 그림과 같이 3명이 동시에 memberService를 요청했을때 멤버서비스가 3개가 생성될것이다. public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer() { AppConfig appConfig = new AppConfig(); //1. 조회: 호출할 때 마다 객체를 생성 MemberService memberService1 = appConfig.memberService(); //2. 조회: 호출할 때 마다 객체.. 인프런/스프링핵심원리(기본) 2022. 12. 27. 이전 1 ··· 7 8 9 10 11 12 13 다음