프로그래밍 공부/Spring

    [Spring] @Controller와 @RestController

    String에서 컨트롤러를 지정하기 위한 어노테이션으로는 @Controller와 @RestController가 있다. 기존 Spring MVC의 컨트롤러인 @Controller가 존재하는데도 왜 @RestController를 새로 만들어서 사용하고 있는 것인지에 대해서 정리해보고자 한다. MVC 패턴이란? 먼저, Controller라는 개념이 등장한 MVC 패턴에 대해서 알아보자. MVC 패턴은 Model - View - Controller의 약자로, 각 세가지 형태로 역할을 나누어 개발하는 방법론의 일환이다. 간단하게 설명하면, 각 형태는 다음과 같은 역할을 갖는다. View : 사용자에게 시각적으로 보여주는 부분으로, 사용자와 상호작용을 하는 부분 Model : 해당 애플리케이션이 처리하는 데이터를 ..

    [Spring] @RequestMapping

    @RequestMapping이란? client에서 오는 요청을 처리하기 위한 api url을 매핑할 때, Spring에서는 @RequestMapping이라는 어노테이션을 사용한다. 이때, 편의를 위해서 이 RequestMapping을 4가지로 나뉘어 추가적으로 지원하는데, 이는 아래의 5가지와 같다. @GetMapping @PostMapping @PutMapping @DeleteMapping @PatchMapping @ReqeustMapping의 옵션 value value는 간단하게 말하면 연결할 url이다. 이는 다양한 방식으로 사용할 수 있으며, 기본적으로 url을 넣는 이외에도 정규식, 변수, AntPattern 등을 다양하게 활용할 수 있다. @RequestMapping(value = "/exam..

    [Spring] JsssionID란?

    기존에 진행하던 프로젝트를 수정하는 과정에서 JESSIONID에 대한 이야기가 나와서, 한번 깔끔하게 정리하고자 포스팅해보고자 한다. (그냥 가볍게 java의 SessionID 아니려나? 라는 생각도 들었으나... 오늘 우테코에서 메타 인지 이야기도 나온 김에...) 1. JSESSIONID 란? 톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키이다. 즉, 세션에서 사용되는 쿠키이름이다. 쿠키는 클라이언트에 그리고 세션은 서버에 저장되는 걸로 알고있는게 일반적이고, 그러므로 쿠키보단 세션이 보안에 좋다고 이전에 공부했다. 하지만 세션 또한, 쿠키 형태로 서버와 클라이언트간에 주고 받는다. HTTP 프로토콜은 기본적으로 stateless(무상태)하다. 즉, 상태정보를 유지하지 않기 때문에, 톰캣은 JSE..

    스프링 스터디 기본편 -7

    스프링 핵심 원리 이해 7 - 프로토타입 스코프 빈 스코프란? 스프링에서 지원하는 스코프 싱글톤: 기본! 지금까지 진행한 스코프. 스프링 컨테이너의 시작~종료를 모두 아우르는 가장 넓은 범위. 프로토타입: 프로토타입 빈의 생성과 의존관계 주입까지만 관여. 웹 관련 스코프 - request: 웹 요청이 들어오고 나갈때까지 - session: 웹 세션이 생성되고 종료될 때까지 - application: 웹의 서블릿 컨텍스와 같은 범위로 프로토타입 스코프 스프링 컨테이너는 프로토타입 빈을 생성하고, 의존관계 주입, 초기화까지만 처리! → 프로토타입 빈을 관리할 책임은 클라이언트에게 있음, 종료 메서드 호출 X → 종료 메서드 호출도 클라이언트가 직접! 프로토타입 스코프 with 싱글톤 빈 프로토타입 빈을 그냥..

    스프링 스터디 기본편 -6

    스프링 핵심 원리 이해6 - 의존관계 주입 빈 생명주기 콜백 스프링 빈의 이벤트 라이프사이클 스프링 컨테이너 생성 → 스프링 빈 생성 의존관계 주입 → 초기화 콜백 사용 → 소멸전 콜백 → 스프링 종료 * 초기화 콜백 : 빈이 생성되고, 의존관계 주입 완료후 호출 Q. 왜 객체의 생성과 초기화가 분리되나요? A. 생성자는 객체를 생성하는 책임 / 초기화는 값들을 활용해서 외부 커넥션 등을 연결하는 책임 두가지를 명확히 나눠서 진행하는 것이 유지보수의 관점에서 좋습니다. (간단하다면 한번에 해도 OK) 스프링의 빈 생명주기 지원 방식 인터페이스 InitializingBean, DisposableBean implements를 통해서 넣는 것. 다만, 이 인터페이스는 스프링 초창기에 나온 방식이라 최근엔 자주..

    스프링 스터디 기본편 -5

    스프링 핵심 원리 이해5 - 의존관계 주입 다양한 의존관계 주입방법 생성자 주입: 생성자를 통해 의존관계를 주입받는 방법. (앞서서 배웠던 내용이 이것에 해당됨) 생성자가 하나만 있다면 @Autowired를 생략해도 자동 주입 된다. 물론 스프링 빈에만 해당한다 final 키워드를 통해서 변수를 따로 구성할수도 있음. 생성자에게 혹시라도 값이 설정되지 않는 오류를 컴파일 시점에서 막아줌. → 불변, 필수의 의존관계에 사용 (개발하면 거의 다 불변임) 수정자 주입(setter 주입): setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법 빈을 부르면서 의존관계주입도 동시에 일어남. → 선택, 변경가능성이 있는 의존관계에 사용 필드 주입: 필드에다가 값을 바로 넣어버리는..

    스프링 스터디 기본편 - 4

    * 해당 내용은 스프링 핵심원리 기본편 - 인프런 강의를 기반으로 정리합니다 스프링 핵심 원리 이해4 - 컴포넌트 스캔 지금까지 빈을 등록한 방법은 @Bean이나 XML의 이었고, 이번에는 @ComponentScan을 통한 방법을 알아본다. @ComponentScan @ComponentScan → @Compontent 가 붙은 클래스를 스캔해서 스프링 빈으로 등록. @Autowired → 의존관계 자동 주입 탐색 위치와 기본 스캔 대상 @ComponentScan( -- ) 괄호 안에 적어서 지정 가능한 옵션들 basePackages → 탐색할 패키지의 시작 위치 지정. 이 패키지를 포함해서 하위 패키지를 모두 탐색한다. 권장하는 방법 → 프로젝트 최상단에 AppConfig같은 메인 정보를 두고, 그냥 추..

    스프링 스터디 기본편 -4

    * 해당 내용은 스프링 핵심원리 기본편 - 인프런 강의를 기반으로 정리합니다 싱글톤 컨테이너 Spring 관련 Singleton 싱글톤 패턴 클래스의 인스턴스가 한개만 생성되는 것이 보장되는 디자인 패턴. 싱글톤 컨테이너 스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도 객체 인스턴스 자체를 싱글톤으로 구성한다. →요청이 올때마다 객체를 생성하는 것이 아니라, 이미 만들어진 객체를 공유해서 효율적으로 재사용하는 것. 주의점 위에서 이야기한 대로, 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지하게 설계해서는 안된다. 실제로 이러한 부분들에 있어서 실무에서 많은 문제가 일어난다고 한다. 상속관계가 연결되게 된다면 정말 복잡하기 때문에... 공유필드는 조심하고, 스프링 빈은 항상 무상태로 설계하는 ..

    스프링 스터디 기본편 -3

    * 해당 내용은 스프링 핵심원리 기본편 - 인프런 강의를 기반으로 정리합니다 스프링 컨테이너와 스프링 빈 사실 예전에 스프링을 혼자 한번 공부하려다가, xml을 이해 못해서 포기했었는데 (정말 충격이었고... 무슨소린지 모르겠어서 포기했었다. 생각해보니 그당시 들었던 인강도 좀... 잘못골랐던거같다. 심지어 ide의 도움도 제대로 못받아서... 생략) 옛날에는 xml기반으로 만들었고, 현재는 스프링 컨테이너를 통해 만든다고 한다. Spring 관련 스프링 빈 조회에 대해서 길게 실습을 했는데, 실제로 현업에서는 자주 쓰이지 않는다고. 그렇지만 내부적으로 어떻게 돌아가는지는 배워두는게 좋을 것 같다. 우리가 ApplicationContext를 사용할 때, BeanFactory등의 다양한 인터페이스를 ext..

    스프링 스터디 기본편 -2

    * 해당 내용은 스프링 핵심원리 기본편 - 인프런 강의를 기반으로 정리합니다 스프링 핵심 원리 이해2 - 객체지향 원리 적용 spring 관련 의존관계의 중요성에 대해서 다시 생각해보게 된다. 객제지향설계를 잘 만들기 위해서는 (SOLID라고 하는 5개의 원칙이 있는 것은 알고 있었으나, 실제 스프링 개발에서 사용하는 것은 처음이었어서 좀 더 주의 깊게 보았던 것 같다. 참고로 적어보는 SOLID의 5가지 SRP 단일책임원칙 : 한 클래스는 하나의 책임만 OCP 개방 - 폐쇄 원칙 : 확장에는 열려있고, 변경에는 닫혀있어야 한다. LSP 리스코프 치환 원칙 : 객체는 프로그램의 정확성을 깨트리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. ISP 인터페이스 분리 원칙: 관련된 인터페이스만 사용..