스프링 개념
Spring Boot
개발 환경설정최소화함
Web Service
- 컴퓨터들간에 상호작용하기위한 소프트웨어
- 웹서비스orRESTful 서비스
- 관공서 / 웹서비스
- 네이버,구글등 / Rest ful 서비스 /HTTP 메서드 +HTTP URI
리소스는 URI 로 식별 어느위치에 어느자료 < URL 을통해 접근 해당자원이있는 위치
POST(create) , GET(read) , PUT(update) , DELETE(delete)
모놀리스 아키텍처 (전체영향 루즈) > SOA 아키텍처 (SOAP) > mociroServies (Rest)
mociroServies 단점 MSA 마이크로서비스아키텍쳐
- End-to-end 테스트 필요성이 증가
- ci/cd가 중요해짐
- 분산환경이니 디버깅과 추적이어려움
- 다수의 클라이언트 요청 > API GATE (Zuul) 존재 (다수가 호출)
DI 생성 (jUnit,Spring-test)
bean.xml (클래스 빈등록시키기)
DI 의존관계주입 컨테이너 (ApplicationContext)
jUnit의 특징 (pom.xml추가maven)
단정(assert) 메서드로 테스트 케이스의 수행결과를 판별 예 ) assertEquals(예상값,실제값)
4부터는 지원 > 앳 어노테이션
@Test: 테스트수행 메서드, 테스트가 서로영향안주고 각각 독립적 객체생성
@Ignore: 테스트를 실행하지않게함
@Before : @Test 메소드가 실행전에 반드시실행되어짐 ,
@After : @Test 메소드 실행후 > 실행되어짐
@BeforeClass,AfterClass > 딱 한번만 실행되어짐
Spring-Test
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith는 jUnit프레임워크의 테스트 실행방법을 확장할떄사용
SpringJUnit4ClassRunner.class 클래스지정하면 테스트중에 ApplicationContext를 만들고 관리하는 작업을 진행해줌
싱글톤의 ApplicationContext를 보장함
@ContextConfiguration
스프링 빈 설정파일의 위치를 지정할때 사용
@Autowired(스프링 DI에서 사용)
해당변수에 자동으로 빈을 매핑 ,GenericXmlApplicationContext를 굳이 사용안해도됨
<프로퍼티>Bean 의존관계 설정방법d프로퍼티>
XML빈설정메타정보는 자주변경되지않는다 그러나.
자주변경될수있는것은.
<프로퍼티>
예 (DataSourceBean,DB정보) 로 구성.
Setter Injection : <property>
태그
Setter 메서드를 통해 의존관계가있는 Bean을 주입하려면 <property>
태그 사용가능
ref 속성은 사용하면 Bean이름을이용해 주입할 Bean 을찾음.
value 속성은 단순값 또는 Bean이 아닌 객체를 주입할떄사용.
컬렉션 타입의 값 주입(인젝션).
Spring은 List Set Map Properites 와 같은 컬렉션타입을 XML 로 작성해서 프로퍼티에 주입하는 방법제공.
JDBC JPA.
Bean등록 어노테이션
@ Componenet 일반적 스테레오 타입 <bean>
태그와 동일한역할
@ Repository 퍼시스턴스 (파일,데이터베이스) 클래스
@ Service 비즈니스로직 클래스
@ Controller 요청과 응답 처리 클래스
Bean 의존관계 주입
@ Autowired (Type 으로연결)
정밀한 의존관계 주입(DI)이 필요한경우에 유용
프로퍼티 , setter 메서드 , 생성자 , 일반메서드에 적용가능
의존하는 객체를 주입할때 주로 Type을 이용하게된다
<property>
,<constructor-arg>
태그와 동일한 역할을 한다
@ Resource (Name으로 연결)
프로퍼티 ,setter메서드에 적용가능
@ Value
단순한 값을 주입할때 사용된다
@ Value(”Spirng”) 은 <property .. value=:”Spring”/>
과 동일한 역할을한다
@ Qualifier
@ Autowired와 같이 사용되어짐
@ Autowired 가 타입으로 찾는데 어떤 타입의 Bean인지 같이 사용해야함
Component Scan을 지원하는 태그
<context:component-scan>
태그
@ Component를 통해 자동으로 Bean을 등록하고
@ Autowired로 의존관계를 주입받는 어노테이션을
클래스에서 선언하여 사용했을경우에는 해당클래스가 위치한
특정 패키지를 Scan 하기 위한 설정을 XML에 해주어야한다
<context:component-scan base-package=”myspring.di.annot”/>
<context:includ-filter> 태그와 <context:exclude-filter>
태그를
같이 사용하면 스캔대상에 포함시키거나 포함시키지않을때 구체적으로 명시가능
사용자 관리 프로젝트 ( 아키텍쳐)
효율적 유지관리 계층화로 구현
프리젠테이션 계층 view
서비스계층 serivice
데이터액세스 계층 repository
- 도메인모델 클래스 로구성
인터페이스를 이용하여 통신하는것이일반적
프리젠테션 계층 (컨트롤러)(JSP,Html 이 요청>컨트롤러)
- 웹 클라이언트(브라우저) 요청및 응답을처리
- 상위계층(서비스,데이터액세스) 발생하는 Exception 에대한 처리
- 최중 UI에서 표현해야할 도메인모델을사용
- 최종 UI에서 입력한 데이터에대한 유효성검증 (Validation) 기능 제공
- 비즈니스 로직과 최종UI를 분리하기위한 컨롤러기능 제공
서비스 계층
- 비즈니스 로직처리 ,비즈시으와 관련된 도메인모델의 적합성검증
- 트랜잭션 처리 (데이터베이스와연동했을떄)
-
프리젠테이션 계층 과 데이터액세스 계층 사이를 연결하는 역할
두 계층이 직접적으로 통신하지 않게하여 애플리케이션의 유연성을증가
느슨결합
- 다른 계층들과 (데이터베이스와) 통신하기위한 인터페이스 제공
데이터액세스 계층 (spring JDBC)
- 영구저장소 (DB)의 데이터를 조작하는 데이터액세스로직을 객체화
- DB의 데이터를 post get put delete
- ORM(Object Relational Mapping) 프레임워크 (MyBatis,Hibernate)를 주로 사용하는 계층
- Dao 인터페이스와 @Repository 사용
도메인 모델 클래스
- 데이터베이스 Entity 와 비슷한개념으로 가진 VO 혹은 DTO 객체에해당
- 3개 계층에 전체에 사용
- private 선언된 멤버변수 , 그변수에대한 getter와 setter 메서드를 가진 클래스를말함
JSP (Html) > 컨트롤러 (@Autowired(service) >
서비스(유저인터페이스).서비스클래스(imple클래스)(@Autowired(DTO) >
Dao(인터페이스),Dao클래스(imple구현) SpringJDBC(DataSource), MyBatis(SqlSession)
데이터 액세스 공통개념
DAO(Data Access Object) 패턴
- DAO패턴을 적용하여 비즈니스 로직과 , 데이터액세스 로직을 분리하는것이원칙
- 서비스 계층에 영향주지않고 데이터액세스 기술을 변경할수있다
DataSource
- DB커넥션(커넥션풀링) 디비 기법
- 공유 가능하게 스프링 빈으로 등록해주어 사용할수있도록함
SimpleDriverDataSource
- getConnection() 호출시 DB커넥션을 새로만들고 pool 을 관리안함 단순테스트용
SingleConnectionDriverDataSource
순차적 진행되는 통합테스트에서는 사용가능
위에 심플보다는 빠르다
멀티쓰레드에서는 적합하지않음
Apche Commons DBCP
- 가장 유명한 오픈소스DB 커넥션 풀 라이브러리
기존의 JDBC
- 엔티티 클래스와 어노테이션을 이용하는 ORM기술(MyBatis,hibernate)도 내부적으로는 DB와의연동을위해 JDBC 를 사용한다
- 로우 레벨 기술로 인식되는이유가 (중복된코드반복사용,Checked Exception으로 처리)
- Connection 과 같은 공유리소스를 제대로릴리즈안하면 시스템 자원이 바닥나는 버그를발생
- ORM (프로그래밍 언어의 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 도구)
Spring JDBC
- 기존의 JDBC 단점 극복
- JDC사용 하여 매개밴셔루 넘어온값 VO객체
- 어떤객체에 넘겨받을지 지정만해주면됨
- 먼저 DB커넥션을 가져오는 데이터소스를 빈으로등록해야함
Connection 열기와닫기
- 필요한 시점에서 알아서 열기닫기해줌
- 진행중 에 예외가 발생하더라도 알아서닫아줌 (리소스반납)
Statement 준비와닫기
- SQL 정보 객체를 알아서 필요한 준비작업해줌
- 사용이끝나고 반납도 릴리즈도 알아서해줌
Statemen 실행
- Statement(SQL) 실행도 알아서 SpringJDBC가해줌
ResultSet Loop처리
- ResultSet 에 담긴 쿼리 실행 결과가 한건이상시 루프를만들어 알아서반복
Exception 처리와 반환
- JDBC 작업중 발생하는 모든예외는 SpringJDBC변환기가 처리
- 체크예외인(try-catch) SQLException을 > 런타임예외(not try-catch) DataAccessException 타입으로변환
Transaction처리
- SpringJDBC 사용하면 transaction(Commit,Rollback)과 관련된 모든 작업은 신경안써도됨
JdbcTemplate(SpringJDBC)
- 실행 : Insert,Update 같이 DB에 변경이일어나는 쿼리를 수행
- 조회 : Select 를 이용해 데이터를 조회
- 배치 : 여러개의 쿼리를 한번에 수행
멀티스레드 환경에서도 안전하게 공유해서 쓸수있기때문에
DAO 클래스의 인스턴스변수에 저장해두고사용할수있다
update()메서드
- INSERT,UPDATE,DELETE
- int update (Sting sql , [SQL 파라미터])
오토와이어드> 셋데이터(파라미터)
queary()
- 여러개의 열 여러개의 행
quearyForObject()
- 여러개의 열 한개의 행
AOP의 개요와 용어
- Aspect( 로깅 - 보안 - 트렌젝션) 부가기능
- 핵심에서 관심사(기능)을 분리하여 >Aspect(모듈) 로 OOP를 도와주준다
타겟 (비즈니스로직)
- 핵심기능을담고있는모듈 , 타겟은 부가기능을 부여할대상
어드바이스 (부가가능)
- 어드바이스는 타겟에 제공할 부가기능을 담고있는 모듈
조인 포인트
- 어드바이스가 적용될수있는 위치 , 즉 타겟 객체가 구현한 인터페이스의 모든메서드
포인트 컷 (선별)
- 어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식
- 포인트컷의 표현식은 execution 으로 시작, 메서드의 Signature를 비교하는 방법을 주로 이용
애스펙트 (Aspect) = 어드바이저(Advisor ,스프링AOP에서만 불림)
- 어드바이스+포인트컷 = Aspect(AOP기본모듈)
- 싱글톤 형태의 객체로 존재
위빙 (삽입 비즈니스로직에)
- 포인트컷에서 결정된 타겟의 조인포인트에 부가기능을 추가할수있도록해주는 핵심적인 처리과정
Spring은 프록시(Proxy) 기반AOP를지원
- 타겟객체에 대한 프록시(호출을가로챔) 를만들어제공
- 타겟을 감싸는 프록시는 실행시간(런타임)에 생성
- 프록시는 어드바이스(부가기능)을 타겟 객체에 적용하면서 생성되는 객체
- 부가기능을 먼저 실행하거나 (전처리) , 타겟을실행후 부가기능실행 ( 후처리)
Spring AOP는 메서드 조인포인트만 지원
-
Spring 은 동적 프록시 기반으로 AOP 를구현하므로 메서드는 조인 포인트만 지원함 즉,
타겟의메서드가 호출되는 런타임 시점에만 부가기능을 적용할수있음
-
반면 AspectJ같은 고급 AOP 프레임워크를 사용하면
객체의 생성 , 필드값의 조회와 ,초기화 static메서드 호출및 초기화등 다양한작업에 부가기능적용가능
Spring AOP의 구현방식
XML 기반의 POJO클래스를 이용한 AOP 구현
- 부가기능을 제공하는 Advice 클래스를 작성
- XML 설정파일에
<aop:config>
를 이용해서 애스펙트를 설정한다(어드바이스,포인트컷을설정)
@Aspect 를 이용한 AOP 구현
- Aspect클래스를 작성 (어드바이스를 메서드와 ,포인트컷을포함)
- XML 설정 파일에
<aop:aspectj-autoproxy/>
를 설정
Spring MVC
- 모델 - 뷰 - 컨트롤러 MVC 패턴
- Model : 애플리케이션의정보 ( 데이터,비즈니스로직)
- View : 사용자에게 제공할 화면 ( 프레젠테이션 로직) JSP
- Controller : Model과 View 사이의 상호작용을 관리
클라이언트 (요청) > 컨트롤러(호출) > 모델(결과) >컨트롤러(화면생성요청) >뷰(결과화면) > 컨트롤러 (응답) >클라이언트 (사용자)
모델 : 데이터저장소 (데이터베이스) 트랙잰션(추가,변경,삭제) , DAO클래스 ,Serivce 클래스
뷰 : 사용자에게 출력한 화면을만드는일 ,HTML CSS Java Script 를 사용하여 UI 를만듬 (Html , JSP)
컨트롤러 : Sevlet 과 JSP 사용
JSP가 컨트롤러역할을하면 복잡해짐 > 최근에는 Serlvet을 사용
클라 (API요청) > 서버(서블릿컨테이너,톰캣서버) 호출 > URL확인 요청을 처리할 서블릿찾는다 > 실행
모델 자바객체를호출 >
모델객체는 EJB(엔터프라이즈 자바빈스) 이거나 POJO로 된 Service,DAO object) 일수도있음
Spring MVC의 특징
- 트랜잭션 , DI , AOP 같은 기능뿐아니라 서블릿 기반의 웹개발을 위한 MVC 프레임워크제공
- 모델2 아키텍처와 Fron Controller(>Controller) 패턴을 프레임워크차원에서제공
Spring MVC 와 Front Controller 패턴
- 대부분 MVC 프레임워크는 Front Controller 패턴을 적용해서구현
- Spring MVC 도 DipatcherServlet(Front Controller 패턴) 이라는 클래스를 계층 앞단에놓고
서버로 들어오는 모든요청을받아서 처리하도록 구성
- 예외가 발생했을때 일관된 방식으로 처리하는것도 Front Controller의 역할
DipatcherServlet 클래스 (Front Controller 패턴적용)
- Web.xml 에 설정
- 클라이언트의 모든요청을 전달받음
DipatcherServlet > Controller(개발자작성)
클라이언트(요청) > DipatcherServlet > DipatcherServlet(HandlerMapping (컨트롤러선별)>)Controller(클라>요청처리결과,뷰페이지정보를담아)>ModelAndView객체를반환 >DipatcherServlet>뷰리졸브(뷰선별) >뷰 > DipatcherServlet > 클라
Restful Controller 핵심 어노테이션
- 클라이언트에서 전송한 XML, JSON 데이터를 컨트롤러에서 자바객체로 받거나 변환한다
- RequestBody : HTTP (XML , JSON) 바디 > Java객체로 전달
- ResponseBody : Java객체를 >HTTP(XML , JSON) 바디에 전송
Ajax(asynchoronous javascript and Xml)란?
- 웹 사용자에게 수준높은 인터페이스를 제공 에 도움을주는 접근법)
- 비동기적
- 입력과 동시, 페이지일부만 로드
jQuery 를 이용하여 Ajax를 통신하는경우
- 자바스크립트로 Ajax코드를 작성하면 코딩량많아지고, 각 브라우저에 맞게 구현해줘야함
- jQuery를 이용하면 코딩량적고 크로스 브라우징 이 쉬워짐
- 100줄정도의 소스 코드를 단몇줄만으로 간단하게 가능
Leave a comment