본문 바로가기
IT 용어 개념 정리

[Framework/Spring/MyBatis/Web] 개념 정리

by 파프리카_ 2020. 10. 26.
728x90
반응형

1. Spring IOC (DI)

2. AOP (Aspect Oriented Programming)

3. MyBatis Framework (영속성 계층 프레임워크) 

4. SpringMVC

5. SpringBoot

6. SpringSecurity


 

높은 응집도(cohension)과 낮은 결합도(coupling)

"모듈 간 결합도는 최소화하고, 모듈 내 요소들 간의 응집도를 최대화"

  • 응집도 : 자신의 역할에 집중하는 정도
    - 모듈 내 기능 수행을 위해 요소 간에 얼마만큼의 연관된 책임이 집중되어있는 지를 나타내는 정도
  • 결합도 : 모듈 간의 상호 의존 정도

구체적으로 표현하면,

> 결합도가 낮아진다는 표현은 의존 대상 변경 시 기존 제어 방식은 객체 생성 및 확보 부분의 소스코드 수정이 불가피 하나,

IOC 적용 시에는 상위 인터페이스 타입으로 관리되고, 

IOC 컨터이너에 의해 객체가 확보되므로,기존 소스코드 수정을 최소화하여 관리할 수 있다.

> 응집도가 높아진다는 표현은 의존 대상 객체의 생성 및 확보 부분은 IOC 컨테이너에 위임하므로,

자신의 비즈니스에 집중할 수 있다는 의미이다. 

 

* 모듈화 : 소프트웨어를 각 기능 별로 분할하여 설계 및 구현하는 기법 


객체 지향 (Object-Oriented)

- 시스템을 분석, 설계하는 기법

- 객체를 독립적인 기본 단위로 채택하고(기능 단위X), 객체와 객체간의 관계를 중심으로 분석, 설계, 구현하는 기법

 

-  객체 지향의 주요 개념 

 Ecapsulation 

 : 인터페이스와 구현부를 나눈 것 = "구현부는 숨기고, 인터페이스는 공개한다."

1. 서비스 제공자 입장 :

      →  구현부가 변경되어도, 인터페이스(시스템 운영)에 영향을 주지 않으므로, 결합도를 낮출 수 있다.

      (= 유지보수성을 높일 수 있다.)

 2. 사용자 입장 :

    → 구현부가 변경되어도, 인터페이스(사용 방법)는 바뀌지 않으므로, 사용자 편의성을 높일 수 있다.

     ( = 인터페이스만 알아도 사용가능하다 = 생산성이 높다. )

     (= 사용자는 본인의 기능에만 집중하면 된다. = 응집도가 높아진다. )

 

 Inheritance 

: 부모의 멤버(속성, 기능)을 자식에게 물려주어 재사용할 수 있다.

: 계층 구조 형성을 통한 다형성 적용 환경을 제공한다.

 

 Polymorphism 

"One Interface, Multiple Implements"

 

* abstract : 단일 상속 - 부모의 멤버를 물려줌(구현을 강제함)

   ex)피자 - 그냥 피자, 페페로니 피자, 포테이토 피자..

    interface : 다중 상속 - 다양한 계층구조 형성 - 부모의 멤버를 물려주지는 않음

   ex)오버라이딩 - 동일한 인터페이스를 주기 위해 사용한다


- 객체와 클래스와의 관계 : 클래스는 설계도, 객체는 건물 (클래스는 붕어빵 틀, 객체는 붕어빵)

 

- class : Object의 설계도

- package : 클래스들을 분류

- Library : 재사용 가능한 프로그램들의 모음

- component : 프로그램들이 실행될 때, 하나의 독립적 기능단위를 이루어 부품화될 때 컴포넌트라 불린다. (=레고 블럭)

- API (Application Programming Interface) : 응용 프로그램을 개발하기 위해 제공하는 인터페이스

(어플리케이션 사용에 필요한 인터페이스를 제공해주는것)

- Framework  : 사전적 의미 = 틀, 뼈대, 기반(infrastructure)-인프라를 제공한다.

 

* Libaray와 Framework의 차이 : 관점의 차이이다.

혼용되어 사용하기는 하지만,
- 개발의 기반이 되는 것이라고 볼 때는 Framework (다양한 component, library 를 제공할 때 - Spring, MyBatis)이라 부르고, 
- 재사용 가능한 component를 지니고 있을 때, Library라 부른다. 


 Spring Framework 

1) java application의 설계, 구현, 테스트, 운영(유지 보수) 전반에 대한 기반을 제공

  & 높은 생산성과 유지보수성 향상을 위해 다양한 인프라를 지원한다.

(* infra : 다양한 라이브러리디자인 패턴을 지원)

 

2) 프레임워크는 반완전한 어플리케이션이다.

* Framework  : 사전적 의미 = 틀, 뼈대, 기반(infrastructure)

즉, 개발자는 비즈니스 로직에 집중할 수 있도록 기반을 제공하는 것이 프레임워크의 목적이다. 

(기반 위에서 개발한다!)

 

3) IOC(DI/DL), AOP, MVC, Security 등을 지원하고,

MyBatis, JUnit 과 같은 오픈소스 라이브러리와의 통합을 지원한다.


1. Spring IOC (DI)

+ 스프링 프레임워크는 POJO(Plain Old Java Object) 기반 프레임워크

( 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크 ) 

: Spirng Framework는 경량 컨테이너로 자바 객체를 담고 직접 관리합니다. 

객체의 생성 및 소멸 그리고 라이프 사이클을관리하며 언제든 Spring 컨테이너로 부터 필요한 객체를 가져와 사용할 수 있습니다. 

 

IOC 원리
Proxy 

 

IOC (Inversion Of Control) : 제어의 역행, 제어의 반전, 역제어

- 의존 대상을 필요로 할 때, 기존 제어 방식(생성하는 것)이 아니라,

IOC 컨테이너로부터 의존 대상을 확보하는 방식으로 시스템을 구축하는 것을 말한다. 

- 결합도를 낮추고, 응집력을 높이는데 기여한다.

(겹합도를 낮춘다 = loose coupling  ⇒ 유지 보수성을 높인다. )

 

* DL/DI = 의존성을 확보하는 방법

DL (Dependency Lookup) : 의존성 검색

필요로하는 의존대상(객체 or bean)을 lookup 검색을 통해 실현한다.

DI (Dependency Injection) : 의존성 주입

필요로하는 의존대상(객체 or bean)을 Injection 주입을 통해 실현한다. (→ DL보다 더 IOC적인것!)

 

사례 : MemberDAOImpl를 new를 통해 직접 생상하지 않고, IOC방식을 통해 xml 방식으로 DL하여 가져오고, DI하여 생성자를 주입한 경험이 있다. + MemberDAO를 interface로 만들어 유지보수성을 높였다. 


* bulid : 라이브러리를 집합으로 모아두어 어플리케이션을 만들어주는 것. 이에 도움을 주는 것이 maven.

Maven(메이븐) = Dependency Management

1. 의존성 관리 (*의존 라이브러리 관리)

2. 사용 목적 : 어플리케이션이 필요한 많은 라이브러리를 일괄적으로 관리

3. 장점
1) 한 번 가져오면, local repository에 저장되어 다른 프로젝트에서 쉽고 빠르게 사용 가능

2) 라이브러리를 버전 별로 사용할 수 있어, 협업에 도움이 된다.

* 개발할 때 사용하는 도구

* pom.xml에서 설정한다. *pom = project object model (프로젝트 객체 모델)


2. AOP

AOP (Aspect Oriented Programming) : 관점 지향 프로그래밍

- 시스템을 핵심관심사항(Core Concern)과 횡단관심사항(Cross-cutting Concern)으로 구분하여, = 관심을 분리하여

분석, 설계, 구현, 운영하는 것을 말한다.

- core : 비즈니스 로직           ex)회원관리-회원서비스에서만 함, 상품관리 - 상품 서비스에서만 함

- cross-cutting : 공통 기능

 

사용 목적

: AOP를 적용하면, 

① 핵심관심사항 서비스를 제외한 횡단관심사항 서비스를 별도의 모듈에서 개발하여 적용하므로,

여러 서비스에 걸쳐있는 반복적 작업을 줄일 수 있어 생산성이 높아진다. 

② 이후 요구사항 변경 시에도 유연하게 대처할 수 있으므로, 유지보수성이 높아진다.

*유사한 DB의 기능 : Trigger

 

사용 방법

  1. weaving : 적용 
    - 횡단 관심 사항을 정의 
  2. pointcut : 적용 대상 선정
    - IOC 기반 하에, AOP 설정을pointcut으로 적용대상을 지정 (ex. execution)
  3. advice : 적용 시점 지정
    - advice로 횡단괌심사항 서비스 적용 시점을 지정한다. (ex. around, before..)

* IOC와 AOP 둘 다, 결합도를 낮추고, 응집도를 높이는 역할을 하지만,

IOC가 결합도를 낮추는데 좀 더 기여하고(loose-coupling), AOP가 응집도를 높이는데 좀 더 기여한다.

 

+

 

log4j

: 프로그램 작성시 로그를 남기기 위해 사용되는 자바 기반 로깅 라이브러리

설정 파일에서 팩키지별로 레벨 지정이 가능, 지정한 등급 이상의 로그만 저장하는 방식이다.

(사용 이유 : 비상 시를 대비해서, 모든 프로그래밍은 기록이 필요하다!(DB에 모든 정보를 저장하기에는 비용이 많이 든다.)

  • FATAL (가장 높은 로그레벨)
  • ERROR - 개발 시, 에러가 발생할 때 사용 (Exception 메시지를 별도로 저장해두고 싶을 때)
  • WARN - 개발 시, 에러는 아니지만 에러 발생 가능 지점에 사용(주로 운영 시에 사용)
  • INFO 
  • DEBUG - 개발 시, 디버그할 때 사용
  • TRACE (가장 낮은 로그레벨)

3. MyBatis

MyBatis

- 영속성 계층 프레임워크 (persistence layer framework)이다. 

- JDBC의 반복된 개발을 프레임워크에서 처리해준다.

 

사용 목적

1. 효과적인 JDBC를 가능케해준다. - 기존 JDBC에서 반복적인 코딩이 있었던 부분을 줄일 수 있도록 해준다.

   → 생산성 향상

2. SQL과 코드(어플리케이션)을 분리해서 사용할 수 있도록 해준다. - SQL은 mapper.xml에 정의 

   → 유지보수성 향상

 

 

* JOIN : 하나 이상의 테이블을 결합하여 조회

- Inner Join : 조인 조건에 일치하는 정보를 조회

- Outer Join : 조인 조건에 일치하지 않는 정보까지 모두 조회 ex)부서에 사원이 없는 경우에도 모든 부서정보 검색 가능

- Self Join : 하나의 테이블을 자체적으로 조인


정규화 (Nomalization)
  : 1) 데이터 중복을 최소화하고,
    2)  데이터의 무결성 및 안정성을 보장하기 위해
           테이블을 분해하는 과정을 말한다.

 

> 제 1 정규화 (1NF(Nomal Form))
  : 복수의 속성값을 분리 (도메인(=데이터)이 원자값)

  - 하나의 컬럼에 여러 개의 데이터를 넣음


  > 제 2 정규화 (2NF)
   : 주 식별자에 완전 종속되지 않는 속성을 분리
     (부분함수적 종속을 분리하여 완전 함수적 종속 상태로 만들기)

 

  > 제 3 정규화 (3NF)
   : 일반 속성에 종속적인 속성을 분리
     (이행적 함수 종속 성을 분리)
   
 * 참고 ) 반정규화 
  : 시스템 성능 향상, 개발 및 운영 편의성을 위해,  정규화된 모델을 통합, 분할하는 과정으로,

     의도적으로 정규화 원칙을 위배하는 행위이다.


 Annotaion 

: 주석이 선언적 프로그래밍 모델을 지원하는 기술

의미있는 주석 - Annotaion(ex. @Controller)은 컴파일과 런타임 시에 영향을 주는 주석이다.

 

설정정보 (메타데이터)

- XML : 코드와 설정이 분리, 유지보수성에 초점

- annotaion : 코드 상에 설정 명시, 생선성에 초점

 

> Spring Annotation

→ 설정 정보의 역할

 

Spring Configuration(스프링 설정) 방법

→ XML + Annoataion + properties + Java Config

 

Spring IOC Annotation 종류

  1. @Component 컴포넌트 계열 어노테이션 : 스프링 컨테이너에 해당 클래스의 객체를 생성하도록 명시 (class 위에 쓴다.)
    -  @Repository : 영속성 계층에서 사용 (ex. MemerDAO)
    -  @Service : 비즈니스(서비스) 계층에서 사용 (ex. MemberService)
    -  @Controller : 프레젠테이션 계층에서 사용 (ex. MemberController)
    -  @Component : 모든 컴포넌트에 대한 제너릭 스테레오 타입 
                                         - 위 세가지에 해당하지 않는 경우 기타 자원 클래스에 사용
                                            (ex. IOC/DI 다 가능하지만 세밀한 제어는 불가능하다)
  2. @DI(Dependency Injection) 계열 어노테이션 : 스프링 컨테이너로부터 의존성(의존대상객체)를 주입받고자 할 때 사용
     (instance변수 위에 쓴다.)
    - @AutoWired : 의존 대상 객체를 타입으로 검색해 주입 
                                   (단, 동일한 인터페이스의 구현 객체가 여러 개 있을 경우 Exception 발생)
    - @Resouce : 의존 대상 객체를 타입으로 검색해 주입 - 주로 사용
                                (추가적으로 @Resource(name="beanId")를 명시하면 bean id로 검색해 주입)

 

 

Spring AOP Annotation 종류

  1. @Component (class 위에 쓴다.)
    - 컴포넌트 어노테이션을 명시해 스프링 컨테이너가 객체 생성하도록 한다.
  2. @Aspect (class 위에 쓴다.)
    - 스프링 컨테이너에 AOP 담당 객체임을 알린다.
  3. @Around(pointcut) (method 위에 쓴다.)
    - 횡단관심사항의 대상 지정과 적용 시점을 지정한다. (pointcut, advice)

* 어노테이션 방식의 Advice와 pointcut 설정

@Around("execution(public * kosta..  *Service.*(..))")

- Advice(Around, Before..) : 횡단 관심사항 적용 시점 ( ex. 메서드 실행 전, 후, 리 턴 시, 예외 발생 시) 

- pointcut : 횡단 관심사항 적용 대상 지정 (execution, within, bean)


< SpringMVC 관련 주요 어노테이션 > - method 위에 쓴다.

  • @RequestMapping(url) : 클라이언트 요청 url에 연결되는 컨트롤러(핸들러) 메서드에 명시 (GET, POST 둘다 가능)
  • @RequestMapping(mathod=RequestMethod.POST.value=url) : POST 방식만 허용
  • @PostMapping(url) : 위 어노테이션을 spring4.3 버전 이상에서는 @PostMapping으로 짧게 표현할 수 있따.
  • @GetMapping(url) : GET 방식만 허용
  • @ResponseBody : Ajax 방식으로 응답할 때 사용하는 어노테이션
    - 핸들러 메서드(컨트롤러 메서드)에서 String 형식으로 반환하면, 문자열 데이터로 응답한다.
       (만약 한글이 포함되면 별도의 추가 설정이 필요)

    - 핸들러 메서드(컨트롤러 메서드)에서 VO or DTO 형식으로 반환하면 JSON Object로 응답한다.
    - List 형식으로 반환하면, JSONArray 형태로 응답한다.

HTTP에 대한 이해 

 

1) 요청 방식

- GET

    : url에 표시

    : select시 사용

- POST

   : 대량의 정보

   : 서버 상태 변경-insert, delete..

   : http response body에 들어감-한글 처리를 위해서는 spring에서는 filter로 처리

 

2) 응답 방식

- 동기적 방식 
  : html로 전송

- 비 동기적 방식 (Ajax 방식)
  : 데이터만 전송(String또는 JSON type으로 전송)

 

3) WAS 구성

- Web Server : HTTP 프로토콜에 의거하여, HTML 방식으로 서비스를 하는 것

- Web  Container : 1) 라이브러리 제공  2) 라이프 사이클 관리

- Web Application : WebContainer내에 여러 개의 어플리케이션이 있을 수 있다. 

- Servlet : 생성 시, ServletConfig가 생성됨 (Serlvet과 JSP는 Web을 위한 객체이다)

                    - Serlvet을 implements하고, HttpSerlvet을 상속받고 있다.

- ServletConfig : Servlet 하나 당 하나 씩 생성된다. ( 서비스에 필요한 초기정보를 할당하는 용도이다 )

                                  SerlvetContext의 주소값을 가지고 있다.

                                  (모든 Servlet/JSP 객체는 ServletConfig를 가지고있다. - httpServlet을 상속받기 때문에!)

- SerlvetContext : Web Application 당 하나 씩 생성되는 환경정보이다.

   웹 어플리케이션 내 모든 SerlvetConfig를 가지고 있는 객체는 SerlvetContext의 정보를 공유할 수 있다.

 

SerlvetConfig와 SerlvetContext에 대한 간단한 테스트 예제


> Serlvet 서블릿 - 서블릿라이프사이클, 서플릿콘텍스트, 세션, 쿠키..

: 서버에 자바클래스를 두고 동작시키는 것 (server + let)

: 자바 웹 프로그래밍 기술이다

 > 서블릿 라이프 사이클 (Serlvet LifeCycle)

  - 라이프 사이클 : 객체를 생성과 소멸을 주관

  - 주요 메서드 : init(), service(), destroy()
     * 처음에는 init()부터 시작하고, 그 다음 response부터는 service()부터 진행된다.

 

> JSP

: 자바 서버 페이지로, 서블릿으로 view를 표현하기 생산성이 좋지 않아서,

   JSP를 이용해서 페이지 view를 표현한다. (결국 JSP도 Servlet이다)

> JSP 라이프 사이클 (JSP LifeCycle)

   : 웹 컨테이너에 의해 .java > .class로 complie된다. 그 후 class loading에서 init(), service(), destroy()된다.

      * jsp가 .java를 내부적으로 생성

 

Serlvet의 LifeCycle
JSP의 LifeCycle


 4. SpringMVC 

SpringMVC 

1. Model2 architecture(설계방식) MVC 패턴을 기반으로 한다. 

   * model - 비즈니스 로직 및 데이터 연동 로직 담당 ex)DAO/Serivce, DTO/VO 

   * view-클라이언트에게 응답할 화면이나 데이터를 제공 ex)화면(jsp)이 제공되거나, 데이터(ajax방식)만 제공되는 방식이 있다. 

   * controller - 클라이언트의 요청과 응답에 대한 제어, model과 연동하고 적절한 view를 선택 

2. FrontController pattern을 기반으로 한다.
     - 모든 클라이언트의 요청을 하나의 진입점으로 모아서 일관된 정책을 적용한다.

        * dispatcher-servlet을 이용한다.

    -  dispatcher servlet은 일관된 정책(예외처리, 인코딩, 보안, 로깅..) 을 이용하여 생상선을 높이고, 유지보수성을 높인다.

 

SpringMVC의 주요 구성 요소

  • DispatcherServlet : Front Controller 역할
  • HandlerMapping : 요청을 처리할 컨트롤러 연결 (RequestMappingHandlerMapping을 사용한다)
    * @RequestMapping이 기재된 Handler(Controller)를 찾는다.
  • ViewResolver : 적절한 View를 찾아 응답하도록 하는 역할 (InternalResourceViewResolver를 사용한다)
  • View : JSP(화면), JSON-Ajax(데이터)
  • Controller :  실제 요청을 처리하는 컨트롤러 로직을 담당
    * HttpServletRequest와 HttpServletResponse, HttpSession, Cookie를 이용해

      클라이언트의 요청을 분석하고 적절한 응답을 한다. 

 

스프링 소스 제공 :  provided by Spring Source

개발자 구현 : Implemented by developers

스프링 소스 제공이나 때때로 개발자가 구현 : provided by Spring Source sometimes implements by developers

 


진행 과정

1. DispatcherServlet의 servlet-name에 의거해 스프링 설정 파일 로딩

2. DispathcerSerlvet의 init-param에 contextConfigLocation을 이용해, 

     다수의 스프링 설정 파일 로딩

     * Spring에서 제공하는 DispatcherSerlvet은 자신의 SerlvetConfig에 init-param으로

        contextConfigLocation이 제공되면 서블릿 이름으로 자신의 설정파일을 찾지 않고,

        두 번째 설정 방식에 의해 자신의 설정 파일을 찾는다.

     

 

사용 목적

- dispatcherservlet과 같은 frontcontroller와 handlermappin과 같은 factory를 제공해준다. 

- 생상성을 높일 수 있다.

 

SpringMVC을 구현하는 두 가지 스타일

xml : 코드와 분리 - 유지보수를 위해!

annotation : 코드 상에 기술 - 생산성을 위해!  * xml이 방대해지고, 설계 시 확정되는 부분들은 이를 사용


JUnit Framework

: 자바 어플리케이션 단위 테스트 프레임워크

//Assert.assertEquals([기대값], [실제값])
Assert.assertEquals(1, itemDAO.getItemCount());

[ Transactio 트랜잭션 ]

트랜잭션(transaction) : 논리적 작업 단위 (데이터 처리의 단위)

 

AOP @Transactional  : 선언적 방식의 트랜잭션 관리

참고) 프로그래밍적으로는 connection에서 setAutoCommit(false)를 설정해서,

수동커밋 모드에서 정상수행 시 commit, 문제 발생 시 rollback

 

commit : 변경 사항을 실제 DB에 저장

rollback : 변경 사항을 취소, 원상태로 복귀

 

ex)

계좌 이체(논리적 작업단위)라는 트랜잭션에서는

출금 후 송금처리가 완료되지 않은 상태에서 문제가 발생할 경우,

→ rollback하여 출금을 취소하고

문제 없이 송금처리가 완료될 경우

→ commit하여 작업을 마무리한다.


* 참고

트랜잭션의 4가지 특성 (ACID)

  1. 원자성(Atomic) : 트랜잭션은 분해가 불가능한 최소 단위여야 함 (All or Nothing)
  2. 일관성(Consistency) : 트랜잭션이 성공적으로 완료되면 일관성있는 DB 상태를 보존
    - 업무적으로 처리된 데이터(commit)는 변하지 않고 일관성있게 보존되어야 한다.
  3. 격리성(Isolation) : 트랜잭션 수행 시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장
  4. 지속성(Durability) : 성공적으로 수행된 트랜잭션은 영원히 반영

728x90
반응형