[Spring] Spring 개념 중요한것들

1.스프링 특징과 관련 용어(IoC, DI, AOP, Portable Service Abstraction)

@Transactional(mybatis):

트랜잭션 처리를 지원하는데, 그중 어노테이션 방식으로 @Transactional을 선언하여 사용하는 방법이 일반적이며, 선언적 트랜잭션이라 부른다.

클래스, 메서드위에 @Transactional 이 추가되면, 이 클래스에 트랜잭션 기능이 적용된 프록시 객체가 생성된다.

IOC:

IoC란 Inversion of Control의 줄임말로 한글로 번역하면 제어의 역전이라는 말이다.

“제어의 역전” 이라는 의미는 말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라,

외부에서 결정되는 것을 의미한다.

DI:

DI란 Dependency Injection의 줄임말로 한글로 번역하면 의존성 주입이라는 말이다.

“의존성 주입”은 제어의 역행이 일어날 때 스프링이 내부에 있는 객체들간의 관계를 관리할 때 사용하는 기법이다.

자바에서는 일반적으로 인터페이스를 이용해서 의존적인 객체의 관계를 최대한 유연하게 처리할 수 있도록 한다.

의존성 주입은 말 그대로 의존적인 객체를 직접 생성하거나 제어하는 것이 아니라,

특정 객체에 필요한 객체를 외부에서 결정해서 연결시키는 것을 의미한다.

즉, 우리는 클래스의 기능을 추상적으로 묶어둔 인터페이스를 갖다 쓰면 되는 것이다.

나머지는 스프링에서 객체를 주입해주기 때문이다.

따라서 이러한 의존성 주입으로 인해 모듈 간의 결합도가 낮아지고 유연성이 높아진다.

Portable Service Abstraction:

인터페이스를 통한 약한 결합도와 DI를 활용하여 스프링은 변화하는 환경에서도 일관성 있는 추상 API 계층을 제공한다. 이를 PSA(Portable Service Abstraction) 이라고 말한다. 휴대성 추상 서비스 즉 변경에 있어서 유연하게 대처할 수 있는 서비스를 제공하는 것이다

2.AOP-Advice(공통업무) : 용어정리 잘해

언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의하고 있다. 예를 들어, ‘메서드를 호출하기 전’(언제)에 ‘트랜잭션을 시작한다.’(공통기능)기능을 적용한다는 것을 정의하고 있다.

Target 클래스에 조인 포인트에 삽입되어져 동작(적용할 기능)할 수 있는 코드를 ‘어드바이스’라 한다.

관점으로서 분리되고 실행시 모듈에 위빙된 구체적인 처리를 AOP에서는 Advice라고 한다. Advice를 어디에서 위빙하는지는 뒤에 나오는 PointCut이라는 단위로 정의한다.

또한 Advice가 위빙되는 인스턴스를 ‘대상객체’라고 한다.

advice는 Pointcut에서 지정한 Jointpoint에서 실행되어야하는 코드이다.

cp.) 스프링의 Advice 타입

  • Around Advice: Joinpoint 앞과 뒤에서 실행되는 Adcvice

  • Before Advice: Joinpoint 앞에서 실행되는 Advice

  • After Returning Advice: Jointpoint 메서드 호출이 정상적으로 종료된 뒤에 실행되는 Advice

  • After Throwing Advice: 예외가 던져질 때 실행되는 Advice

  • Introduction: 클래스에 인터페이스와 구현을 추가하는 특수한 Advice

3.스프링 MVC 관련용어(5개), 흐름(forward, redirect)

  • MVC 패턴

M(Model) : Data/ DB를 직접 다루는 부분 V(View) : 뷰단/ 보이는 부분 C(Control) : 이벤트와 콘트롤등.. 제어 기능 부분 (실질적인 프로그램 부분)

  • DAO (Data Access Object) : CRUD를 전문적으로 다루는 클래스 (연결지향)

  • DTO (Data Transfer Object) : DAO의 데이터를 묶어서 BL/PL단에 던져주는 기능 (연결지향) : Data 전송을 위해 encapsulation 해ㅛ가.

Redirect redirect는 서버에 요청이 들어온 후 , 서버에서 실제로 클라이언트로 HTTP Stauts Code 302를 전송한다.

전송된 응답을 클라이언트에서 받아서 302 응답코드를 확인하고 응답의 Location 헤더에서 URL을 읽어들여 해당 URL로 다시 요청을 보낸다.

Forward forward는 서버에 요청이 들어온 후, 서버에서 모든 일이 벌어진다. 서블릿 컨테이너는 해당 요청을 그대로 타겟 URL로 포워딩 시킨다. 따라서 URL은 브라우저에서는 변경되지 않을 것이고, 리다이렉트와 다르게 응답은 한번만 내려오게 된다.

4.환경설정 방식 (xml, 자바,annotation)

-container가 객체 생성하고 주입하는 방법(<bean, @Autowired(타입기준으로 주입), java(@Confuguration) xml 방식 이용시->생성자 주입, setter 주입시 사용 태그

5.스프링 부트 특징

  1. 작업 결과를 jar로 패키징하여 단독 실행이 가능하다.
  2. 미리 잘 짜인 라이브러리의 조합을 가지고 있어서 라이브러리 관리가 용이하다.
  3. 스프링 레거시 프로젝트의 복잡한 설정을 자동화하여 개발자가 비지니스로직에 집중할 수 있게 한다.
  4. 디폴트로 사용하는 View 형식은 JSP 파일로, 추가 dependency를 설치하지 않아도 사용할 수 있다.

6.mybatis

  1. SQL을 자바 소스와 별도로 분리해서 관리한다.
  2. JDBC로 작성한 코드의 단점(분량, 반복코드)을 많이 줄여준다.
  3. properties 파일에 쿼리를 저장해 관리한다.
  4. SqlSession의 쿼리 처리 메소드를 이용해 작업한다.

7.RESTFUL(컨트롤러 설정 @RestController, CRUD관련 메서드 4개)

@RestController는 Spring MVC Controlle에 @ResponseBody가 추가된 것입니다. 당연하게도 RestController의 주용도는 Json 형태로 객체 데이터를 반환하는 것입니다.

20210510_014222

8.스프링관련 어노테이션, @Controller, @Repository, @Service, @Component

전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용합니다. 아래와 같은 과정을 통해 Spring MVC Container는 Client의 요청으로부터 View를 반환합니다.

@Contoller 어노테이션을 붙이면 핸들러가 스캔할 수 있는 빈(Bean) 객체가 되어 서블릿용 컨테이너에 생성됩니다. 마찬가지로 @Repository, @service 어노테이션은 해당 클래스를 루트 컨테이너에 빈(Bean) 객체로 생성해주는 어노테이션입니다.

둘 다 Bean 객체를 생성해주고 딱히 다른 기능을 넣어주는게 아니라서 뭘 써도 상관 없긴한데 명시적으로 구분해주기 위해 각자 분리해서 사용합니다. 부모 어노테이션인 @Component를 붙여줘도 똑같이 루트 컨테이너에 생성되지만 가시성이 떨어지기 때문에 잘 사용하지 않습니다.

  • 컨트롤러 : @Controller (프레젠테이션 레이어, 웹 요청과 응답을 처리함)
  • 로직 처리 : @Service (서비스 레이어, 내부에서 자바 로직을 처리함)
  • 외부I/O 처리 : @Repository (퍼시스턴스 레이어, DB나 파일같은 외부 I/O 작업을 처리함)

9.동기요청시 파라메터에 붙이는 어노테이션

->@RequestParam: ReuqestParam 을 이용한 값 받아오기

@ReuqestParam 어노테이션은 HttpServletRequest 객체와 같은 역할을 한다.

@Controller public String hello(@RequestParam String num, @RequestParam String name){}

10.비동기 파라메터에 붙이는 어노테이션(ajax)

->@PathVariable: @PathVariable @PathVariable 파라메터를 사용하면 아래와 같이 URI의 일부를 변수로 전달할 수 있다. @GetMapping(“/bars/{barId}”) fun getBar(@PathVariable(value = “barId”) barId: Optional)

@RestController(@Controller + @ResponseBody)

@GetMapping(value=”/customers/{num}”) public String hello(@PathVariable String num){} -> URI 경로상의 변수값을 받아오기 위해 사용하는 어노테이션은? @PathVariable

11.@RequestBody / @ResponseBody 구분하기

@RequestBody 어노테이션과 @ResponseBody 어노테이션은

각각 HTTP 요청 몸체를 자바 객체로 변환하고 자바 객체를 HTTP 응답 몸체로 변환하는 데 사용

@RequestBody

  • HTTP 요청 몸체를 자바 객체로 전달받음
  • HTTP 요청의 body 내용을 자바 객체로 매핑하는 역할

@ResponseBody

  • 자바 객체를 HTTP 응답 몸체로 전송함
  • 자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할

public String hello(@RequestBody Customer c){} //@RequestBody :json타입의 데이터를 자바객체로 받을 때 @ResponseBody : 자바객체를 json형식으로 보낼 때

12.상태코드관련(200~500)

200 : 200 OK: 성공적으로 처리했을 때 쓰인다. 가장 일반적으로 볼 수 있는 HTTP 상태. 404: 404 Not Found(찾을 수 없음): 찾는 리소스가 없다는 뜻으로, 가장 흔하게 볼 수 있는 오류 코드이다. 405: Method Not Allowed(허용되지 않은 방법) : PUT이나 DELETE 등 서버에서 허용되지 않은 메소드로 요청시 사용하는 코드이다. 401, 402: 401: Unauthorized(권한 없음): 인증이 필요한 리소스에 인증 없이 접근할 경우 발생한다. 이 응답 코드를 사용할 때에는 반드시 브라우저에 어느 인증 방식[5]을 사용할 것인지 보내야 한다. 단순히 권한이 없는 경우 이 응답 코드 대신 아래 403 Forbidden을 사용해야 한다.

402: 402 Payment Required(결제 필요): 결제가 필요한 리소스에 결제없이 접근했을 경우 발생. HTTP/1.1에서 정의되었으나 구현하지는 않고, 향후에 사용하기 위해 예약해둔 코드이다. 현재 딱히 표준조차도 존재하지 않는다. 이런 상황에서는 보통 403을 사용한다.

500: Internal Server Error(내부 서버 에러): 서버에 오류가 발생해 작업을 수행할 수 없을 때 사용된다. 보통 설정이나 퍼미션 문제. 아니면 HTTP 요청을 통해 호출한 문서가 실제 HTML 문서가 아니라 JSP, PHP, 서블릿 등의 프로그램일 경우 그 프로그램이 동작하다 세미콜론을 빼먹는 등의 각종 에러로 비정상 종료를 하는 경우 이 응답코드를 보낸다.

13.boot

main()클래스에 있는 @SpringBootApplication이 포함하는 3가지 중요 anno(예외: @MapperScan은 아님)

@Configuration, @EnableAutoConfiguration 그리고 @ComponentScan을 디폴트 속성으로 함께 사용하는 것과 같다.

출처: https://sieunlim.tistory.com/10 [개발노트]

스프링 어노테이션

@Configuration, @Component

@Configuration은 설정을 위한 어노테이션으로 개발자가 생성한 class를 Bean으로 생성 할 때 Single Tone으로 한번만 생성하고

@Component는 Bean을 생성 할 때 java에서 new로 생성하듯이 생성한다.

@ComponentScan

지정한 위치 이하에 있는 @Component와 @Configuration이 붙은 class를 스캔해서 Bean으로 등록한다.

스프링 XML 설정의 을 대신해서 자바에 설정

14.

결합도 낮 응집도 높

15.web.xml-안에 기술되는 내용

servlet, filter, welcome file(interceptor는 아님)

16.

root-context.xml: dao, servive, db pool servlet-context.xml: controller, interceptor

17.SpringMVC 요청 처리 순서를 적으시오

① 요청(Request)이 브라우저에서 떠나면서 사용자가 요구하는 내용을 전달한다. 하나의 프런트 컨트롤러 서블릿에서 요청을 처리하는데, 단일 프런트 컨트롤(DispatcherServlet)라는 단일 서블릿이 실제 처리를 수행하기 위해 다른 컴포넌트에 대한 요청 책임을 위임하는 웹 애플리케이션의 일반적인 패턴을 제공한다.

② DispatcherServlet은 요청을 전달할 컴포넌트를 선택하기 위해 핸들러 매핑(Handler Mapping)에 도움을 요청한다. ③ 적절한 컨트롤러가 선택이 되면 해당 컨트롤러로 요청을 보낸다. 컨트롤러에서 적당한 로직을 타고 로직의 결과물이 사용자의 브라우저에 표시되기 위한 형태의 정보로 변환된다. → 모델

④ 모델과 뷰를 포함하여 DispatcherServlet에 요청을 돌려보낸다. 이 때, 뷰 이름은 직접적으로 특정 jsp를 의미하는 것은 아니며, 실제 뷰를 찾아내는데 필요한 논리적인 이름이다.

⑤ DispatcherServlet은 뷰 리졸버에게 논리적으로 주어진 뷰의 이름과 실제로 구현된 뷰를 매핑해 줄 것을 요청한다. ⑥ jsp로 모델 데이터를 전달한다. ⑦ 뷰에서 모델 데이터를 이용해 결과를 렌더링하고 응답 객체(Response)에 의해 클라이언트로 전달된다.

18.Rest 서비스란 무엇인지 기술하시오.

REST 란??

Representational State Transfer의 줄임말로 네트워크 상에서 클라이언트와 서버 사이의 통신 방식중 하나이다

REST(Representational State Transfer)는 웹 상에 존재하는 다양한 자원들을 HTTP 프로토콜을 이용하여 전송하는 인터페이스다. 자원(이미지, 동영상, DB 자원)등 에 고유한 URI(Uniform Resource Identifier)를 부여해서 활용한다.

인터페이스, 즉 시스템간에 신호를 주고받기위한 매개체다. 이 인터페이스를 이용해서 우리가 웹상에서 보는 데이터들인 자원을 주고받는다. 이때 HTTP 프로토콜을 이용하니 우리(클라이언트)가 웹을 이용하며 자원을 요청(Request)하면 서버(Server)에서 자원을 보내준다(Response).

19.Interceptor - Filter 차이

Filter: 클라이언트 요청이 들어오면 제일 먼저 거침(ex.한글필터) Interceptor : 필터 통과하고 frontController(DispatcherServlet) 통과 후 순서)클라이언트 요청 -> Filter -> DispatcherServlet -> Interceptor -> Controller

20.스프링 컨테이너가 객체를 생성하면 기본 singleton방식이므로 이를 바꾸려면 scope=”prototype”지정해야 함

덤)

REST 구성요소

Resource

REST에서 가장 중요한 개념은 바로 유일한 ID를 가지는 Resource가 서버에 존재하고, 클라이언트는 각 Resource의 상태를 조작하기 위해 요청을 보낸다는 것이다. 일반적으로 Resource는 user, friends, group 등과 같은 명사형의 단어이고, HTTP에서 이러한 Resource 를 구별하기 위한 ID는 ‘/groups/{groupId}/member/101’와 같은 URI이다.

Method

GET, DELETE 등과 같이 Resource를 조작할 수 있는 동사형의 단어를 Method라고 한다. 클라이언트는 URI를 이용해서 Resource를 지정하고 해당 Resource를 조작하기 위해서 Method를 사용한다. HTTP에서는 GET, POST, PUT, DELETE 등의 Method를 제공한다.

Representation of Resource

클라이언트가 서버로 요청을 보냈을 때, 서버가 응답으로 보내주는 Resource의 상태를 Representation이라고 한다. REST에서 하나의 Resource는 여러 형태의 Representation으로 나타내어 질 수 있다. 예를 들어 xml, json, text, rss 등으로 전달할 수 있다.

URI 구성

  • URI는 ‘/groups’, ‘/users’ 등과 같이 직관적으로 어떤 정보를 제공하는지 알 수 있는 단어들로 구성

  • URI는 ‘/groups/{groupId}/member/101’와 같이 URI path가 계층적인 구조를 가지도록 구성

  • URI의 상위 path는 하위 path의 집합을 의미하는 단어로 구성. 예를 들어 ‘/groups/101/member/12532’의 경우 ‘groups’는 ‘101’ 등의 그룹의 집합이므로 ‘/groups’ 만으로도 그룹 목록이라는 정보를 제공할 수 있는 유효한 URI가 된다.

  • CREATE / DESTORY/UPDATE/DELETE 등의 기본 CRUD 처리는 URI에 명시적으로 표현하도록 하여 URI를 보더라도 직관적으로 어떤 기능을 제공하는지 알 수 있도록 명명하도록 한다.


예전에 쓰다 만거

스프링 특징과 관련된 용어(IOC, DI, AOP, Portable Service Abstraction)

@Transactional(mybatis) 이거 쓰면 트랜잭셔널 처리가 된다. 마이바티스건 jpa건 뭐건 트랜잭션은 저거 하나만 쓰면 된다.

AOP-Advice(공통업무) 용어정리

  • 스프링 MVC 관련 용어 (5개(각각 5개가 무슨 일 하 는 지 알아두자.)) , 흐름(forward, redirect), 환경(xml, 자바) -> 환경은 Container가 객체 생성해 주는데 주입하는게 몇가지 방법이 있었다. 이런거로 주입시켜주거나 @Autowired로 주입시켜주는 경우도 있었다(기준이 타입이 똑같은거로 주입시켜 주는 거), java로 주입시켜주는 경우도 있었다.

java파일 안에서 Configuration 사용해서 내가 xml대신 필요한 파일 만드는 작업이였다.

스프링 mvc 관련용어 (5개), 흐름 (forwadrd, redirect) ,

상태코드 관련 (200~500)

  1. 작업 결과를 jar로 패키징 해서 단독 실행이 가능하다.
  2. 미리 잘 짜여진 라이브러리의 조합을 가지고 있어서 관리가 용이하다.
  3. 스프링 레거시 프로젝트의 복잡한 설정을 자동화하여 개발자가 비지니스 로직에 집중할 수 있게 한다.
  4. 디폴트로 사용하는 뷰형식은 jsp 파일로, 추가 dependency 설치 안해도 사용할 수 있다. 스프링 부트 특징

스프링 동기 파라미터 -> @RequestParam @Controller public String hello(@RequestParam String num, @RequestParam String name){}





© 2021.03. by yacho

Powered by github