본문 바로가기
WEB/Framework

전자정부프레임워크 QuickStart / Part 1 표준프레임워크 구조와 개발환경 / Part 2 표준프레임워크 실행환경 / Part 3 표준프레임워크 운영환경 / Part 4 표준프레임워크 관리 환경

개발은 글쓰기 부터
ppowerddev 2022. 2. 1.
반응형

Part 1 표준프레임워크 구조와 개발환경


CHAPTER 01 표준프레임워크 개요

Section 1. 프레임워크 개요

프레임워크
어떠한 목적을 달성(문제 해결) 하기 위해 복잡하게 얽혀 있는 구조(뭐가 많이 엮여있긴함)
SW 개발 시 근간을 이루는 뼈대(표준, 기준)
클래스 및 패턴의 집합으로 소프트웨어 개발의 효율성과 품질을 높이기 위한 반제품 성격의 SW
반제품 성격을 추측해보자면..
-> 정식 제품은 아니지만 하나의 제품처럼 사용하고 있어서
-> 성능이 튜닝된 제품을 토대로 분야 별로 필요한 서비스 컴포넌트를 만들어 삽입하는 형태로 시스템 구축을 도와준다. (완전히 굳어진 하나의 제품이 아니라 유동적으로 부품을 갈아 끼울 수 있다는 뜻인 듯)

결국 프레임워크는 내가 필요로 하는 방향으로 바꿔 쓸 수 있다는 말이 된다.


결국 왜 필요한가?
코드의 재사용과 효율성에 대한 문제의 진화과정에서 나온 결과물이라고 볼 수 있다.
메서드 재사용 -> 객체의 재사용 -> 컴포넌트(모듈, 패키지 단위) 재사용 -> 프레임워크 재사용 단위로 발전

대표적인 프레임워크

계층에 따른 분류 프레임워크 종류
웹 애플리케이션 프레임워크 Struts, Spring MVC, WebWork 등
비지니스 관련 프레임워크 EJB, Spring 등
데이터베이스 관련 프레임워크 MyBatis(iBatis), Hibernate, Spring DAO 등
기타프레임워크 로깅 Log4j
빌드,배치 자동화 Ant, Maven, Gradle
단위테스트 JUnit

 

Section 2. 프레임워크 개념

전자정부 표준프레임워크는 정보시스템 개발을 위해 필요한 기능 및 아키텍처를 미리 만들어 제공함으로써 효율적인 애플리케이션 구축을 지원하기 위해 만들어졌다.
응용 SW 표준화, 품질 및 재사용성 향상을 목표로 한다.(원래 프레임워크 역할)
자바 기반의 정보시스템 구축에 활용할 수 있는 개발 및 운영 표준 환경을 제공하기 위한 것이다.(정부 기반)

Section 3. 프레임워크 구성

3.1 개발환경
업무 프로그램의 개발에 필요한 환경 제공

개발자 통합 개발 환경 : 필요한 프로그램들과 예제와 교육자료 등 모두 포함하는 풀버전
개발자 경량 개발 환경 : 개발환경만 설치(회사에서 사용하는 거, 표준 프레임워크에 익숙하고 각 플러그인의 의미와 다운로드 및 업데이트 방법만 이해한다면 더 적합함)

구현기능 구현내용
구현도구 UML Editor / ERD Editor  
통합 플러그인 개발화면
DBIO Editor(db연결) SQL
테스트도구 Test Case 테스트 코드를 작성할수있는 도구
Test Coverage 테스트 커버리지를 분석하는 도구
Test Reporting 테스트 결과를 다양한 포맷으로 리포팅하는 도구
배포도구 개발자 빌드 도구 빌드도구
배포도구 주기설정
형상관리도구 Configuration Management 형상요소의 식별 및 등록, 히스토리를 지원하는 형상관리도구
Change Management 이슈관리

1) 구현 도구
에디터 설정 (표준 프레임워크의 에디터 = 이클립스)
eclipse.ini (이클립스 성능 향상을 위해 파일 수정. 메모리 설정 가능)

2) 테스트 도구(Junit : 단위 테스트에 가장 많이 사용되는 툴)
자바 기반 오픈소스 테스트 프레임워크
기댓값과 결괏값을 비교 및 검증할 수 있는 assertion 기능 제공
테스트 케이스와 테스트 스위트(suite)로 구성되어 테스트 코드를 하나의 독립적인 클래스 단위로 작성할 수 있다.
->테스트 케이스 : 테스트를 수행할 수 있도록 작성된 코드, 대상이 되는 클래스에 대해서 1:1로 테스트 케이스 작성
>>테스트 케이스에는 테스트할 클래스에 대한 여러 가지 경우의 테스트의 입력 값, 수행 조건, 예상되는 결괏값을 테스트한다.
->테스트 스위트 : 테스트 케이스를 묶어서 동시에 실행하도록 모아둔 코드

->junit 사용

>>단순 자바는 사용할 수 있을 것 같은데 웹에선 어떻게 사용할 수 있으려나 현업 프로젝트 다뤄보니 import 되는 객체가 한두 개가 아니던데..
>>그래서 테스트 코드는 왜 짜야하지?.. SI 웹 개발자로서는 찍어내기 바쁘다 보니 솔직히 잘 모르겠다 이것부터 알아봐야 할 것 같다

테스트 코드 관련 포스팅 글



3) 배포 도구
3-1) 빌드 도구: 메이븐
->빌드 : 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정
소스코드를 작성하고 나면 실행하기까지 여러 작업들이 필요하다.
디렉터리 만들기 -> 파일 이동 -> 컴파일 -> 테스트 -> 압축하거나 해제 -> 웹서버나 형상관리 서버에 올리기 등.. 이런 작업들을 빌드 도구가 도와준다.

개인 빌드 작업(커밋하기 전 이클립스로 작업하는 내용)
1. 개발자가 소프트웨어 소스코드를 작성한다.
2. 개인 빌드를 통해 실행 가능한 바이너리 코드를 생성한다.
3. 정상 코드 여부를 판별 후 형상 관리 서버로 작성한 코드를 커밋한다.

통합 빌드 작업(이건 본 적이 없는데..)
1. 개발 서버는 형상관리 서버로부터 최신이 소스코드를 체크아웃한다.
2. 주기적 자동 빌드 프로세스를 통해 코드 빌드 후 동작 가능한 소프트웨어 패키지를 생성한다.
3. 운영 서버로 패키징 한 소프트웨어를 배포한다.
-> 젠킨스라는 시스템을 이용해서 통합 빌드 작업을 한다고 한다
-> 아래 링크의 포스팅 글대로 우리 회사는 여러 명의 개발자들이 git을 이용하여 버전 관리를 하고 있고 최종적으로 개발이 완료된 프로젝트 소스를 FTP를 이용하여 서버에 업로드를 하고 웹서버를 직접 재구 동하여 테스트를 진행하고 있다.
>> 작업 단위가 작아서일까.. 아직은 수동 방법을 사용하고 있다.. 젠킨스 사용하자고 권해봐야 하나?
https://streetdeveloper.tistory.com/20

 

[Jenkins] 통합 빌드 시스템

CI라는 것이 있다. Continuous Intergration의 약자로써 직역하면 지속적인 통합이라는 뜻이다. 위의 그림을 보면, (디자이너들이 보면 암걸리는 이미지...) 여러명의 개발자들이 SVN을 이용하여 버전관

streetdeveloper.tistory.com



3-2) 메이븐
컴파일, 패키징, 테스트 등의 작업 프로세스를 정형화하고 구조와 절차를 제공한다.
소스 트리 구성도(src/main/java)과 같은 정형화된 패턴을 따르도록 가이드해준다.

컴파일되는 과정, 패키징 되는 과정(jar 파일 만드는 과정)등을 메이븐이 스스로 알아서 하는 것이 아니라 compiler 플러그인과 jar 플러그인에서 수행하며 메이븐은 필요시 플러그인을 다운로드하고 메이븐 중앙 저장소에서부터 주기적으로 업데이트를 해준다.

사용하는 프로젝트에서 디펜던시 관리, 로컬 및 원격 저장소 사용, 빌드 로직의 전역적인 재사용, 툴에 대한 이식성과 통합 등의 기능을 사용할 수 있으며 프로젝트 산출물(Project Artifacts)들의 쉬운 검색과 필터링이 가능하다.


아키텍처

  • Project Object Model(프로젝트 객체 모델) : POM은 메이븐의 기본이 되는 모델을 의미한다.
  • Dependency Management Model(디펜던시 관리 모델)
  • Project Life cycle and Phases(빌드 라이프 사이클과 각 단계)

플러그인
메이븐은 플러그인을 구동해주는 프레임워크(plugin execution framework)이다.
모든 작업은 플러그인에서 수행한다.
플러그인은 다른 산출물(artifcats)과 같이 저장소에서 관리된다.
플러그인은 하나 이상의 goal(maven의 실행 단위, 명령 작업)을 포함하고 있다.
->플러그인과 골의 조합으로 실행된다.
mvn <plugin>:<goal> = mvn archetype:generate
-> 메이븐은 여러 goal을 묶어서 lifecycle phases로 만들고 실행한다.
mvn <phase> = mvn install
>> 실제로 명령 프롬프트에 명령어 사용해서 실행하듯 사용하는걸 이클립스에서 자동으로 해주는 것 같다.

플러그인 목록

core plugins clean, compiler, deploy, failsafe, install, resources, site, surefire, verifier 기본 단계에 해당하는 핵심 플러그인
Packaging types/tools ear, ejb, jar, rar, war, app-client, shade 압축 도구
Reporting plugins changelog, changes, checkstyle, javadoc, pmd, surefire-report 리포팅 도구
Tools ant, antrun, archetype, assembly, dependency, pdf, plugin, repository 기타 다양한 도구

(빨간색소년블로그https://sjh836.tistory.com/131)
pom.xml
artifactId : 실제 프로젝트 이름, 각 프로젝트를 식별하기 위해 사용된다.
특정 프로젝트의 아티팩트를 이용하여 다른 프로젝트의 디펜던시에 추가할 수 있다.
-> 해당 아이디를 이용해서 이곳저곳 필요한데 사용하면 그게 프레임워크가 되는 것 같다.

scope : jdk나 웹 애플리케이션 서버(WAS)에서 제공하는 라이브러리디펜던시에서 선언한 라이브러리 간의 충돌이 일어나는 경우가 발생할 수 있으므로 사용하고자 하는 라이브러리의 스코프를 명시해줘야 한다.

디펜던시 적용범위
compile 기본값으로 모든 클래스 패스에서 사용가능하다(패키지포함)
provided 컨테이너나 jdk에서 제공한다. (패키지미포함)
예) Servlet API, JSP API
runtime 런타임시 사용
예) JDBC drivers
test 테스트 단계에서만 사용한다
system provided와 유사하나 개발자가 직접 jar 파일을 제공해야하고 지정한 dependency를 찾지 않는다.



4) 형상관리 도구 = 버전 관리시스템
중앙집중형 버전 관리시스템 (svn)
단일 서버, 이 서버에 버전 관리를 필요로 하는 모든 파일들이 있고 다수의 클라이언트가 접속하여 파일들을 체크아웃하는 형식
내가 작업하고자 하는 파일 또는 프로젝트 버전만 서버에서 받아온다.
-> svn은 그냥 상태 확인 용인 것 같다.

분산 버전 관리시스템(git)
저장소 전체를 클라이언트에 다운로드한다.
-> git은 다양한 작업을 함으로써 개발자에게 용이

4-1) svn
특징
1. 디렉터리 버전 관리 : 가상의 버전 관리 시스템을 구현
2. 버전 이력 기능 강화
3.atomic commit : 변경 사항 전체가 저장소에 완전하게 반영되거나 , 전혀 반영되지 않을 수 있다.
4. 메타데이터 버전 관리 : 파일과 디렉터리는 각각 관련한 속성 키와 값의 조합이며 임의의 키/값 조합을 생성해 보존할 수 있다. 속성도 파일의 내용과 동일하게 버전 관리된다.
5. 네트워크층의 선택 : 액세스용 추상 레이어(?)가 있어, 새로운 네트워크 프로그램을 간단하게 구현, svn 서버는 독자적인 프로토콜에 의해서 시큐어 셀(ssh) 이용한 터널 통신을 간단하게 실행할 수 있다.
6. 데이터 처리의 일관성 : 동일한 알고리즘을 사용해 파일의 변경 부분을 표현한다. 텍스트에도 바이너리에 대해서도 같은 방법
7. 효율적인 브랜치, 태그의 작성: 프로젝트를 복사하는 것으로 브랜치와 태그를 만든다.
8. 확장하기 쉬움

전자정부프레임워크 공식사이트

아키텍처
command line app : 커맨드 라인 클라이언트 프로그램이다. dos나 쉘처럼 명령어를 직접 입력하여 서버와 통신한다.
gui cilent apps : gui 클라이언트 프로그램 tortoiseSVN, 이클립스 subversive 플러그인을 사용해서 접속할 수 있다.
apache-mod_dav_svn : apache http 서버용의 플러그인 모듈로 저장소를 네트워크상 다른 사용자가 사용할 수 있도록 해준다.
svnserver: daemon으로 ssh로부터 기동 되는 독립 서버 프로그램, 네트워크에 있는 저장소를 사용할 수 있도록 방법 제공
svn repository(저장소) : 모든 프로젝트의 프로그램 소스들과 소스에 대한 변경사항이 저장되는 곳


명령어
init : svn 서버에 프로젝트 저장소를 만든다
import : 초기버전에 대한 소스나 문서, 파일 등을 서버에 올린다. 아무것도 없는 곳에 처음 넣는 작업
->이클립스에서는 Team -> share project
checkout : 서버에 저장되어 있는 걸 자신의 로컬 작업 환경에 가져온다. 전체 소스의 최종 리비전 가져오기
update : 서버에 저장되어 있는 최근의 소스를 로컬로 가져온다. 변경된 부분만 가져온다.
->체크아웃 한 이후의 타인에 의한 소스 변경 사항을 확인하는 작업
->저장소 소스와 로컬 소스를 비교하여 최신 버전의 소스를 가져오며 변경된 항목은 최신 버전의 로컬에 통합된다.
->갱신 우선적
conflict : 저장소의 리비전이 더 높을 경우 충돌 발생. 즉 타인에 의해 수정되고 커밋된 상태
commit : 로컬 소스를 수정, 파일 추가, 삭제한 후 저장소에 저장하여 갱신한다. 커밋을 하면 전체 리비전이 1 증가한다.
export : 릴리즈 때 사용, 체크아웃과 달리 버전 관리 파일들을 뺀 순수한 소스 파일 받아오기
->trunk > branches

+ Error
이클립스 IDE에 SVN 프로그램 자체가 없어서 생긴 에러
회사에선 자연스럽게 항상 있었어서 따로 설치해본 건 처음이다

 

Subversive설치후 SVN Connector가 설치 되지 않아 발생되는 문제 해결.

한동안 Git을 사용하다가 새로운 프로젝트에 들어오면서 오랜만에 SVN을 설치 했다. Eclipse Marketplace에서 subversive최신 버전을 선택하고 설치 후 재시작을 했는데 프로젝트가 제대로 받아지지 않는

jeonjin.tistory.com

 

이클립스를 이용하여 svn 사용하기 - System Software

lmc.cs.kookmin.ac.kr

이클립스에도 파일 비교 기능이 있지만 Source Tree라는 프로그램이 UI가 잘되어있어서 소스 관리하기 조금 더 편하다

 

[Eclipse] 이클립스에서의 파일 비교 - Compare With.. 의 종류

이클립스를 사용하다가 이전 버전의 소스를 비교하고 싶을 때 사용하는 Compare With.. 비교하고자 하는 파일에서 마우스 오른쪽 버튼을 클릭하면 Compare With 가 있다. 위와같이 파일을 비교하는데

elena90.tistory.com

리눅스에서 SVN 서버 설치하는 방법

 

리눅스 SVN 설치 및 설정

윈도우에서 VisualSVN Server를 이용하여 간단하게 잘 쓰고 있었는데, 스맛폰을 서버로 좀 써먹을려다보니 어쩔수 없이 리눅스 환경에서 세팅을 하게 되어 기록해 본다.(간단히 써먹기엔 윈도우 환

pmingdiary.tistory.com

4-2) 지속적 통합 도구 CI(Continuous integration) 도구
빌드 자동화 도구
->팀이 작업한 것을 자주 통합하는 것을 가리키는 소프트웨어 개발 단계로 개발자, 버전 관리 저장소, 통합 빌드 머신 등으로 구성된다.
->버전 관리시스템에 변경사항이 발생할 때마다 매번 통합, 빌드, 테스트할 수 있기 때문에 빠른 시기에 문제점을 인식하고 해결할 수 있다.
허드슨
CI SERVER, 소스 빌드 스크립트를 사용한 자동 빌드 및 빌드 결과를 개발자에게 피드백하는 메커니즘을 제공한다.
자동 빌드 가능, 빌드 검증 가능, 빌드 테스트 가능, 컴파일된 코드의 패키징 기능 제공, 결과 대시보드 제공, scm 폴링 기능을 이용
-> SCM(Software Configuration Management) = 소프트웨어 형상관리

SCM 정의 (from Wikipedia)
소프트웨어 형상 관리(SCM)는 형상관리(CM)의 일부이다.
Roger Pressman은 그의 책, "소프트웨어 공학 : 실용주의자의 관점에서 (실제 번역본 제목은 다를 수 있음)"에서 소프트웨어 형상 관리란,
"변경사항을 통제하기 위하여 만들어진 행위들의 집합으로,
(1) 변경될 가능성이 있는 산출물(work product)을 찾아내고,
(2) 산출물 사이의 관계를 확립하고,
(3) 이러한 산출물들의 다양한 버전들을 관리하기 위한 메커니즘을 정의하고,
(4) 발생한 변경사항들을 통제하고,
(5) 가해진 변경사항 들에 대해서 감사(auditing)하고 보고하는 행위"
출처: https://sowlgns.tistory.com/entry/SVNSubversion[인천 총각 Study]
폴링(polling)
하나의 프로그램이 충돌 회피 또는 동기화 처리 등을 목적으로 프로그램의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다. 이 방식은 버스, 멀티포인트 형태와 같이 여러 개의 장치가 동일 회선을 사용하는 상황에서 주로 사용된다. 서버의 프로그램은 순차적으로 각 프로그램에 회선을 사용하기 원하는지를 물어본다


3.2 실행환경
업무 프로그램의 실행에 필요한 공통모듈 등의 표준화가 용이하도록 지원하는 응용 프로그램 환경

구현기능 구현내용
화면처리 레이어(Presentation Layer) Ajax Support UI 컴포넌트에 대한 인터페이스 및 화면 구현에 필요한 아키텍처 제공
업무처리 레이어(Business Layer) Spring(MVC) 비즈니스 로직을 서비스로 구성하여 저리하는 기능 제공
프레임워크 안에 포함
데이터처리 레이어

iBATIS or MyBatis xml 파일에 작성
sql 명령어와 자바객체(vo,dao)를 매핑해주는 기능을 제공한다.
Hibernate or JPA(자바 표준 api) ORM 프레임워크
sql 명령어를 프레임 워크가 생성하여 db 연동을 처리
연계/통합 레이어(Intergration Layer) CXF(Naming Service)
https://t1.daumcdn.net/cfile/tistory/200EDC344D70451922?download
웹 서비스, 연계 메타정보 등의 기능을 제공
공통기반 레이어(Foundation Layer) Log4j ,Spring(AOP, IOC) 서버개발에 필요한 다양한 재사용 컴포넌트,모듈 및 유틸리티 제공
모듈을 이용하여 Spring 컨데이너에서 동작하는 비지니스 컴포넌트를 개발한다.
배치처리 레이어 Batch Core 대용량 일괄처리를 위한 설정 및 실행기능 제공

 

Part 2 표준프레임워크 실행환경


CHAPTER 01 표준프레임워크 실행 환경

Section 1. 스프링과 표준프레임워크

1) POJO(Plain Old Java Object)
-> 평범한 옛날 자바 객체
2) Not POJO 클래스
-> Servlet 클래스는 우리 마음대로 만들 수 없으며 , 반드시 Servlet에서 요구하는 규칙에 맞게 클래스를 만들어야 실행할 수 있다.
>> Servlet 클래스 작성 규칙
javax.servlet, javax.servlet.http 패키지를 import 해야 한다.
public 클래스로 선언되어야 한다.
Servlet, GenericServlet, HttpServlet 중 하나를 상속해야 한다.
기본 생성자가 있어야 한다.
생명주기에 해당하는 메서드를 재정의 해야 한다.

3) 스프링 특징
IOC와 AOP를 지원하는 경량의 컨테이너 프레임워크
AOP : 관점 지향 , 핵심 비즈니스 로직과 반복해서 등장하는 공통 로직을 분리함으로써 응집도가 높게 개발할 수 있도록 지원한다. 공통으로 사용하는 기능을 외부의 독립된 클래스로 분리하고, 해당 기능을 프로그램 코드에 직접 명시하지 않고 선언적으로 처리하여 적용하는 것이 기본 개념이다.
컨테이너 : 특정 객체의 생성과 관리를 담당. 일반적으로 서버 안에 포함되어 배포 및 구동된다. Servlet 컨테이너는 우리가 사용하는 톰캣 서버에도 포함되어있다.

인메모리!!!!

Section 2. 표준프레임워크 템플릿 프로젝트

2.1 표준프레임워크 템플릿 프로젝트 구조 분석
1) 프레임워크 라이브러리
2) src/main/java 소스 폴더
: 프로젝트의 자바 소스들이 들어 있는 폴더로서 비즈니스 컴포넌트와 웹 컴포넌트 패키지로 구성되어 있다.

2-1) service : 비즈니스 컴포넌트가 클라이언트에 공개할 service 인터페이스와 vo 클래스들이 들어있다.
2-2) service.impl : 비즈니스 컴포넌트의 구현 클래스에 해당하는 impl, dao 클래스가 들어 있다.
2-3) web : 웹 컴포넌트에 해당하는 컨트롤러 클래스가 들어있다.
3) src/main/resources 소스 폴더
: xml 파일을 비롯하여 프레임워크(spring 뿐만 아니라 다양한 프레임워크에 대한 정보들)에서 사용할 다양한 설정 파일들이 있다. 표준프레임워크는 크게 3개의 오픈소스 프레임워크(Spring, iBatis, MyBatis)를 사용한다.
4) src/main/webapp폴더
2,3번처럼 소스파일이 아니라 단순 일반 폴더, 이곳에 복잡한 웹 관련 리소스들이 등록되어 관리된다. 이 폴더에서 가장 중요한 WEB-INF 폴더에는 웹 프로그램에 가장 중요한 배치 기술 문서(web.xml)를 포함하여 스프링 설정 파일과 JSP 파일들이 들어있다.
4-1) WEB-INF/config 폴더
springmvc 폴더 : 스프링 컨테이너가 로딩할 환경설정 파일인 dispatcher-servlet.xml 파일이 있다. 이곳에는 스프링 MVC와 관련된 다양한 설정 파일이 있다.
validator 폴더 : 유효성 체크와 관련된 xml 파일. 이 파일들을 이용하면 사용자 입력한 데이터가 비즈니스 컴포넌트로 전달되기 전에 한번 더 체크할 수 있다.
4-2) WEB-INF/jsp 폴더
템플릿 프로그램에서 화면으로 사용할 여러 jsp 파일들이 들어있다.

 

CHAPTER 02 표준프레임워크 실행 환경 공통기반 레이어

1) 스프링 컨테이너, IOC
1-1) 스프링 설정 파일 작성
대부분의 컨테이너는 구동될 때 XML 설정 파일을 읽어 들인다.(Servlet 컨테이너는 web.xml, 스프링 컨테이너도 xml 파일을 필요로 할 때 STS를 이용하여 간단하게 생성할 수 있다)
https://cceeun.tistory.com/61

읽어 들인 xml 파일로부터 자신이 생성하고 관리할 객체들의 정보를 확인한다.
1-2) 로그 출력하기
<Appenders> : 어디에 어떤 패턴으로 로그를 출력할지 결정해준다. 콘솔, 파일 , 데이터베이스에 출력할 수 있다.
<Console> : 콘솔에 출력
<Logger> : 로그 메시지를 <Appenders>로 전달하여 실질적으로 출력한다.

컨테이너가 구동되면서 객체를 메모리에 생성하는 것을 Pre-Loding
클라이언트의 요청에 대해서 해당 객체만 메모리에 생성하는 것을 Lazy-Loding

1-3) 스프링 컨테이너 종류
GenericXmlApplicationContext
파일 시스템이나 클래스 패스에 있는 XML 설정 파일을 로딩하여 구동한다.
XmlWebApplicationContext
웹 기반의 스프링 애플리케이션을 개발할 때 사용된다.

2) 스프링 설정 파일
2-1)<bean> 엘리먼트 속성
init-method="initMethod"
객체를 생성한 후에 멤버 변수 초기화 작업
destroy-method="destroyMethod"
객체가 삭제되기 전에 수행될 작업

3) IOC를 이용한 비즈니스 컴포넌트
3-1) 의존성 주입
스프링의 의존성 관리
Dependecy Lookup - IOC
Dependency Injection - Setter Injection, Constructor Injection
3-2) 의존관계
어떤 객체가 다른 객체의 변수나 메서드를 이용하는 경우가 이에 해당한다.
3-3) Setter Injection의 기본
<property> 엘리먼트를 사용해야 하며 name 속성 값이 호출하고자 하는 메소드 이름이다.
ex) setAddressList() 메소드 호출

<property name ="addressList">
    <list>
    <value>1</value>
    ...
    </list>
</proeprty>


4) 어노테이션 기반 설정
xml 설정이 복잡하고 방대하여 부담을 줄여주기 위한 방법
컴포넌트 스캔 : <bean>을 등록하지 않고 자동으로 객체를 생성

<context:component-scan base-package="user">
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/> 포함
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/> 포함
	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 배제
</context:component-scan>


4-1) @Component 어노테이션
xml 파일의 id 속성 == 컴포넌트 어노테이션을 붙인 클래스의 클래스 이름(맨 앞은 소문자)
xml 파일의 class 속성 == 컴포넌트 어노테이션 붙인 곳이 곧 클래스 장소

4-2) @Component 어노테이션 확장
표준프레임워크로 시스템을 개발하면 시스템 전체를 크게 두 개의 레이어로 나누어 설계한다.
이를 2-Layered 아키텍처라고 한다.
프레젠테이션 레이어 : 사용자와의 커뮤니케이션 담당
비즈니스 레이어 : 비지니스 로직 처리
이 구조에서 핵심 요소는
Controller 사용자의 요청 제어 @Controller
ServiceImpl 실질적인 비즈니스 로직 @Repository
Dao 실질적인 데이터베이스 @Service


위의 3개는 @Component를 상속받아 만들어진 기능들이기 때문에 그냥 @Component 다 박아 놓고 써도 상관없지만 필요에 따라 3가지를 나눠놨을 테니 사용하도록 한다.
결국 @Component표시는 컨테이너에 해당 클래스를 넣고 사용할 때 꺼내쓸 클래스



4-3) 어노테이션을 이용한 의존성 주입
xml 파일에 설정하지 않고 @Resource 어노테이션을 사용하여 의존 관계를 처리한다.
@Resource 어노테이션은 의존성 주입 대상 객체가 메모리에 생성만 되어 있으면 컨테이너가 해당 객체를 자동으로 할당해준다. 반드시 유일해야 한다.
xml과 어노테이션은 같이 써주는 게 좋다.

5) JDBC 기반이 데이터베이스 연동
5-1) vo클래스
레이어와 레이어 사이에서 관련된 데이터를 한꺼번에 주고받을 때 사용한다.
5-2) 스프링 JDBC 설정
JdbcTemplate 클래스가 JDBC API를 이용하여 DB 연동을 처리하려면 반드시 데이터 베이스로부터 커넥션을 얻어야 한다.
따라서 JdbcTemplate 객체가 사용할 DataSource를 <bean>에 등록하여 스프링 컨테이너가 생성하도록 해야 한다.
DataSource 설정은 스프링 jdbc만을 위한 설정은 아니다. 이후 테스트할 트랜잭션 처리나 ibatis, mybatis 연동에서도 datasource가 사용되므로 매우 중요한 설정이다.

6) 스프링 AOP
IOC 가 결합도와 관련되어있다면 AOP는 응집도와 관련 있다.
메서드마다 공통으로 등장하는 로깅이나 예외, 트랜잭션 처리 같은 코드들은 횡단 관심이라고 하고
사용자이 요청에 따라 실제 수행되는 핵심 비즈니스 로직을 핵심 관심이라고 한다.
6-1) AOP 용어 정리
1. 조인 포인트(joinpoint)
클라이언트가 호출하는 모든 비즈니스 메서드로서, SampleServiceImpl 클래스의 모든 메서드를 조인 포인트라고 생각하면 된다. 조인 포인트를 다음에 설명할 포인트 컷 대상 또는 포인트컷 후보라고 하는데 이는 조인 포인트 중에서 포인트 컷이 선정되기 때문이다.


2. 포인트 컷(pointcut)
필터링된 조인 포인트를 의미한다.
트랜잭션을 처리하는 공통기능을 만들었을 때 insertSample에서는 동작을 해야 하지만 updateSample에서는 트랜잭션과 무관함으로 동작할 필요가 없다. 많은 메서드들 중에서 특정 메서드에서만 횡단 관심에 해당하는 공통기능을 수행시키기 위해서는 포인트 컷이 필요하다. 포인트 컷을 이용하면 메서드가 포함된 클래스와 패키지는 물론이고 메소드 시그니처까지 정확하게 지정할 수 있다.
-> execution 필터링되는 메서드 설정

<aop:pointcut id="allPointcut" expression="execution(* egoveframework.sample..impl.*Impl.*(..))"/>



3. 어드바이스(advice)
횡단 관심에 해당하는 공통기능의 코드를 의미한다.
독립된 클래스의 메서드로 작성된다.
이 메서드가 언제 동작할지 스프링 설정 파일을 통해서 지정할 수 있다.

<bean id="advice" class="egoveframework.sample.common.AdvancedSampleAdvice"></bean>

3.1 어드바이스 동작 시점
Before : 비즈니스 메소드 실행 전 동작
After-Returing : 비즈니스 메소드가 성공적으로 반환되면 동작
After-Throwing - 비즈니스 메소드 실행 중 예외가 발생하면 동작 (try-catch)
After : 비즈니스 메소드가 실행된 후 무조건 실행 (finally)
Around : 메소드 호출 자체를 가로채 비즈니스 메소드 실행 전후에 처리할 로직을 삽입할 수 있음
-> <aop:around>
>> before 보다는 후에 after보다는 전에 처리된다.

4. 위빙(weaving)
포인트 컷으로 지정한 핵심 관심 메서드가 호출 될 때, 어드바이스에 해당하는 횡단 관심 메소드가 삽입되는 과정
5. 애스팩트(aspect) 어드바이저(advisor)
포인트 컷과 어드바이스의 결합으로서, 어떤 포인트컷 메서드에 대해서 어떤 어드바이스 메서드를 실행할지 결정한다.


7) 예외처리
7-1) 트랜잭션 처리
<aop:advisor> 엘레먼트를 사용
7-2) 트랜잭션 관리자 등록
트랜잭션 관련 설정에 가장 먼저 등록하는 것은 트랜잭션 관리자 클래스다.
스프링은 다양한 트랜잭션 관리자를 지원하는데 어떤 기술을 이용하여 데이터베이스 연동을 처리했느냐에 따라 트랜잭션 관리자가 달라진다.
스프링이 지원하는 모든 트랜잭션 관리자 클래스는 PlatformTransactionManager 인터페이스를 구현한다.
Spring JDBC, MyBatis - DataSourceTransactionManager
JPA - JPATransactionManager
7-3) 트랜잭션 어드바이스 등록
<tx:advice> 엘리먼트 사용



8) 아이디제너레이션
단순 숫자가 아닌 SAMPLE-00001과 같이 복잡한 문자열을 저장하도록 변경할 때
실제로 유일한 아이디를 생성해주는 클래스
strategy : 아이디 생성 전략 객체를 사용한다. mixPrefixsample 클래스는 따로 만들어줘야 함
blockSize: DB 접속을 최소화하기 위해 내부적으로 사용하는 정보
table : 유일한 아이디가 저장된 테이블 이름이다.
tableName : 생성할 아이디를 구분하기 위한 키 값이며 일반적으로 테이블 별로 아이디가 필요하기 때문에 테이블 이름을 지정한다.

<bean name="egovIdGnrService" class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrServiceImpl" destroy-method="destroy">
	<property name="dataSource" ref="dataSource"/>
	<property name="strategy" ref="mixPrefixSample"/>
	<property name="blockSize" value="1"/>
	<property name="table" value="IDS"/>
	<property name="tableName" value="SAMPLE"/>
</bean>

8-1) mixPrefixSample
prefix : 생성할 아이디의 접두사를 지정한다.
ciper : 접두사를 제외한 숫자 부분의 자릿수를 지정한다.
fileChar : 유일한 숫자를 제외한 나머지를 채울 문자를 지정한다.

<bean name="mixPrefixSample" class="egovframework.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl">
	<property name="prefix" value="SAMPLE-"/>
	<property name="cipers" value="5"/>
	<property name="fillChar" value="0"/>
</bean>


CHAPTER 03 표준프레임워크 실행환경 화면 처리 레이어

Section 1 스프링 mvc

포워드(client -> a.jsp -> b.jsp -> client) : 중간에 바뀌는 url을 알 수 없다
리다이렉트(client -> a.jsp ->client -> b.jsp -> client)


1) Model2 아키텍처
기존에 Model1 아키텍처로 개발한 프로그램에서 JSP 파일에 있는 컨트롤 자바 코드만 Controller로 이동하면 Model2 아키텍처가 된다.
결과적으로 Controller로직이 사라진 jsp에는 view 관련된 디자인만 남게 되고 자바 개발자는 controller와 model만 관리하면 된다.

client -> request -> DispatcherServlet -> HandlerMapping -> Controller -> ModelAndView -> ViewResolver -> View

1-1) DispatcherServlet 등록
모든 클라이언트의 요청을 가장 먼저 받아들이는 DispatcherServlet
가장 먼저 WEB-INF/web.xml 파일에 DispatcherServlet을 등록한다.

action
action = DispatcherServlet

1-2) 스프링 mvc 적용
jsp -> controller로 이동

1-3) ViewResolver
클라이언트 즉 브라우저로부터의 직접적인 jsp 호출을 차단할 수 있어서 대부분의 웹 프로젝트에서 필수적으로 사용한다. WEB-INF 폴더 밑에 있는 파일들은 절대 클라이언트 브라우저에서 접근할 수 없다.
하지만 ViewResolver를 활용하면 WEB-INF 폴더에 있는 JSP 파일을 VIEW 화면으로 사용할 수 있다.

Section 2 어노테이션을 이용한 스프링 mvc 개발

 

결과적으로 입력정보 추출과 vo 객체 생성, 그리고 값 설정을 모두 컨테이너가 자동으로 처리하는 것이다.

1) JSP에서 command 객체 사용하기
command 객체에 저장된 데이터를 jsp에서 사용하려면 el를 이용한다.
등록 화면으로 이동할 때는 사용자가 입력한 데이터가 없기 때문에 samplevo를 command 객체로 받을 필요가 없다.
하지만 스프링에서는 command 객체를 jsp 화면에서 사용할 수 있도록 지원한다.

2) controller 메서드 리턴 타입
return "inserList" : 데이터형이 string인 view이름을 문자열로 리턴하겠다는 의미
mav.setViewName("inserList.do"); return mav : 데이터형이 ModelAndView인 곳에  view를 저장하여 리턴하겠다는 의미
3) 기타 어노테이션
@RequestParam(value="id" defaultValue="1") String sampeld
@ModelAttribute : jsp에서 사용할 데이터를 미리 세팅하는 용도로 사용한다. 설정된 메서드는 @RequestMapping 어노테이션이 적용된 메서드보다 먼저 호출된다. 자동으로 model에 저장된다.

+Error

타입 상태 보고
메시지 파일 [/WEB-INF/sample/forward:selectSampleList.do.jsp]을(를) 찾을 수 없습니다.
설명 Origin 서버가 대상 리소스를 위한 현재의 representation을 찾지 못했거나, 그것이 존재하는지를 밝히려 하지 않습니다.
-> ㅋㅋㅋㅋㅋㅋㅋ이거 forward인데 forward라고 썼음 ㅋㅋㅋㅋㅋㅋㅋㅋ아 전혀 몰랐다..

4) 프레젠테이션 레이어와 비즈니스 레이어 통합하기

4-1) 비즈니스 컴포넌트 의존성 주입하기
참조하는 주체인 컨트롤러보다는 참조되는 서비스 단 객체가 먼저 메모리에 생성되어 있어야 한다. 하지만 현재
dispatcher-servlet.xml파일에는 컨트롤러 객체만 컴포넌트 스캔이 되도록 설정했기 때문에 서비스단 객체는 생성되지 않는다.
결국 컨트롤러보다 의존성 주입 대상이 되는 비즈니스 컴포넌트를 먼저 생성하려면 비즈니스 컴포터는 를 먼저 생성하는 또 다른 스프링 컨테이너가 필요하다. 그리고 이 컨테이너를 컨트롤러 메모리에 생성하는 컨테이너보다 먼저 구동해야 한다.
dao를 매개변수로 받았던 컨트롤러와 달리

dao 외 기능을 가져올 수 있도록 분리시켜주면서 컨트롤러와 서비스단을 이어주는 클래스가 필요하고 그것이 Contextloaderlistener이다.

  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>
  		classpath:egovframework/spring/context-*.xml
  	</param-value>
  </context-param>
  <listener>
  	<listener-class>
  		org.springframework.web.context.ContextLoaderListener
  	</listener-class>
  </listener>

 

컨테이너가 두 번 실행된다고 보면 된다.
부모 컨테이너

자식 컨테이너

 

+Error
해당 파일이 없는 라이브러리 일수 있다

↓maven에 라이브러리 추가
https://www.javadoc.io/doc/org.springframework/spring-web/4.3.2.RELEASE/index.html

 

spring-web 4.3.2.RELEASE javadoc (org.springframework)

Latest version of org.springframework:spring-web https://javadoc.io/doc/org.springframework/spring-web Current version 4.3.2.RELEASE https://javadoc.io/doc/org.springframework/spring-web/4.3.2.RELEASE package-list path (used for javadoc generation -link op

www.javadoc.io

퀵스타트 전자정부 표준프레임워크 공부하면서 contextloaderlistener 적용 시 아래 버전을 꼭 지키세요!!
(회사에서는 잘 짜여있는 라이브러리 묶음만 보다가 이렇게 버전 맞춰 갈려니까 여간 일이 아니네)

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <!-- <version>5.3.15</version> -->
    <version>4.3.21.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.3.21.RELEASE</version>
</dependency>


5) 예외처리

dispatcher-servlet.xml에 설정해주는 예외처리 코드

<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
	<property name="exceptionMappings">
		<props>
			<prop key="java.lang.IllegalArgumentException">
				common/illegalArgumentError
			</prop>
		</props>
	</property>
	<property name="defaultErrorView" value="common/error"/>
</bean>

에러가 적용된 사진

6) 다국어 처리

회사 프로젝트 설정에 항상 있던 거라서 뭔지 궁금했는데 언어 변환해주는 설정이다
미리 언어를 설정해두고 dispatcher-servlet.xml에 관련 클래스를 등록해두고
lang="en" 이런 식으로 호출하면 중간에서 가로채서 어떤 언어인지 확인하고 뿌려주는 역할인 것 같다.

미리언어를 설정해둠
dispatcher-servlet.xml에 관련 클래스 설정

이런 식으로 호출해서 쓴다. 좀 귀찮을 것 같긴 하다.

Chapter 04 표준프레임워크 실행환경 데이터 처리 레이어

Section 1 iBatis 프레임워크 적용


1) iBatis 

APACHE에서 만든 프레임워크, GOOGLE로 넘어가면서 MyBatis로 이름이 변경되었다.
IBATIS 프레임워크를 데이터 매퍼(Data mapper)라고 부른다.
sqlmap xml 파일은 표준 프레임워크 이클립스에 내장된 java orm 플러그인을 이용하여 생성

+Error

갑자기 map-config.xml 파일이 깨지면서 열리지 않을 때
https://www.egovframe.go.kr/home/qainfo/qainfoRead.do?menuNo=69&qaId=QA_00000000000019264

 

묻고 답하기 | 표준프레임워크 포털 eGovFrame

처리중입니다. 잠시만 기다려주십시오.

www.egovframe.go.kr

 

2) 스프링과 iBatis 연동 설정
SqlMapClientFactoryBean 객체를 주입받고 SqlMapClient 객체를 생성하라면

DataSource와 SqlMap(sql-map-config) 정보가 필요하다.

2-1) iBatis 구조
sql-map-config 파일은 iBatis 메인 환경설정 파일이다. 환경설정에 정의된 파일들을 map 구조로 저장하여 관리하고 sql하나당 mappedstatement 객체가 하나씩 메모리에 생성된다.
<insert> 엘리먼트는 parameterClass 속성 생략 가능하다.

2-2) CDATA Section 사용
CDATA는 xml 고유 문법으로xml 파서가 xml 파일을 처리할 때 '<' 작다로 인식 안 하고 또 다른 태그로 인식한다.
단순한 문자 데이터를 xml 파서가 해석하지 않고 바로 데이터베이스에 그대로 전달할 때 사용한다.

2-3) SqlMapClient 객체

SqlMap에 등록된 SQL을 실행하기 위한 다양한 메서드를 제공한다.

1) queryForObejct()
2) queryForList()
3) insert() update() delete()


2-4) EgovAbstractDAO 클래스
표준프레임워크가 제공하는 EgovAbstarctDAO클래스를 상속받도록 한다.

3) 동적 쿼리

<insert id="SampleDAO.insertSample">
    INSERT INTO SAMPLE(ID,TITLE,REG_USER,CONTENT,REG_DATE) VALUES (
        #id#,
        #title#,
        #reg_date#,
        #content#,
        SYSDATE
    )
</insert>


Section 2 MyBatis 프레임워크 적용

1) EgovAbstarctMapper 클래스

표준프레임워크가 제공하는 EgovAbstarctMapper  클래스를 상속받도록 한다.

2) SQL Mapper 문법 및 동적 쿼리 적용

<insert id="insertSample">

    INSERT INTO SAMPLE(ID,TITLE,REG_USER,CONTENT,REG_DATE) VALUES (
        #{id},
        #{title},
        #{reg_date},
        #{content},
        SYSDATE
    )

</insert>

Chapter 05  공통 컴포넌트

Section 1. 공통 컴포넌트 개념

건축물의 창문이나 조명등과 같이 정보시스템을 구축할 때 여러 기관이 공통적으로 활용하기 위하여 재사용이 가능하도록 개발한 컴포넌트 소프트웨어를 의미한다.
공통 컴포넌트는 기술 위주의 컴포넌트가 아닌 기능 위주의 컴포넌트로 개발되었다.
표준 프레임워크에서 제공하는 공통 컴포넌트의 아키텍처


Section 2. 공통 컴포넌트 구성

연관관계 : 한 클래스가 다른 클래스를 멤버 변수로 포함하는 포함관계를 의미하고
의존관계 : 함수 호출 관계를 의미한다.
전자정부 프레임워크는 200종류 넘게 공통 컴포넌트를 제공한다.

Part 3 표준프레임워크 운영환경

실행환경에서 운영되는 서버를 운영하기 위한 환경(모니터리링 , 배포관리 시스템 등..)

Part 4 표준프레임워크 관리 환경

표준프레임워크 센터에서 사용하는 환경(모바일, 웹)

 


1차 그냥 훅 읽기

2차 코딩하면서 정리하기

3차 정리한 거 다시 정리하기

 

내가 개발하고 있는 실행환경과 개발환경이 어떤 것인지 책 제목 그대로 quick 하게 구조를 알게 되었다.

뜬구름 같던 게 대략적인 구름 모양이 된 것 같다. 이제 그 속에 어떤 것들이 있는지 속속히 공부해보고 알아보는 것이 중요할 것 같다.

 

 

2022-02-17 ~ 2022-03-24(완)

반응형