★ 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 (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
사용 방법
- weaving : 적용
- 횡단 관심 사항을 정의 - pointcut : 적용 대상 선정
- IOC 기반 하에, AOP 설정을pointcut으로 적용대상을 지정 (ex. execution) - 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 종류
- @Component 컴포넌트 계열 어노테이션 : 스프링 컨테이너에 해당 클래스의 객체를 생성하도록 명시 (class 위에 쓴다.)
- @Repository : 영속성 계층에서 사용 (ex. MemerDAO)
- @Service : 비즈니스(서비스) 계층에서 사용 (ex. MemberService)
- @Controller : 프레젠테이션 계층에서 사용 (ex. MemberController)
- @Component : 모든 컴포넌트에 대한 제너릭 스테레오 타입
- 위 세가지에 해당하지 않는 경우 기타 자원 클래스에 사용
(ex. IOC/DI 다 가능하지만 세밀한 제어는 불가능하다) - @DI(Dependency Injection) 계열 어노테이션 : 스프링 컨테이너로부터 의존성(의존대상객체)를 주입받고자 할 때 사용
(instance변수 위에 쓴다.)
- @AutoWired : 의존 대상 객체를 타입으로 검색해 주입
(단, 동일한 인터페이스의 구현 객체가 여러 개 있을 경우 Exception 발생)
- @Resouce : 의존 대상 객체를 타입으로 검색해 주입 - 주로 사용
(추가적으로 @Resource(name="beanId")를 명시하면 bean id로 검색해 주입)
Spring AOP Annotation 종류
- @Component (class 위에 쓴다.)
- 컴포넌트 어노테이션을 명시해 스프링 컨테이너가 객체 생성하도록 한다. - @Aspect (class 위에 쓴다.)
- 스프링 컨테이너에 AOP 담당 객체임을 알린다. - @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 형태로 응답한다.
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이다)
: 웹 컨테이너에 의해 .java > .class로 complie된다. 그 후 class loading에서 init(), service(), destroy()된다.
* jsp가 .java를 내부적으로 생성
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)
- 원자성(Atomic) : 트랜잭션은 분해가 불가능한 최소 단위여야 함 (All or Nothing)
- 일관성(Consistency) : 트랜잭션이 성공적으로 완료되면 일관성있는 DB 상태를 보존
- 업무적으로 처리된 데이터(commit)는 변하지 않고 일관성있게 보존되어야 한다. - 격리성(Isolation) : 트랜잭션 수행 시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장
- 지속성(Durability) : 성공적으로 수행된 트랜잭션은 영원히 반영
'IT 용어 개념 정리' 카테고리의 다른 글
OAS(OpenAPI Specification) - 개념, 구조 분석 및 튜토리얼 (0) | 2024.04.25 |
---|---|
[디자인패턴] 객체지향 SOLID 원칙이란? (0) | 2021.03.11 |