알바생 관리 풀이
쿼리 관련
전처리(?)
GRANT SELECT ON MEMBER TO ALBA;
GRANT SELECT ON TB_ZIP TO ALBA;
CREATE TABLE TB_ZIP
AS
SELECT * FROM LKR94.TB_ZIP;
ALTER TABLE REPLY
ADD (REP_PARENT NUMBER(6));
merge 구문: update + delete구문
MERGE INTO BOARD A
USING(
SELECT COUNT(BO_NO) CNT
FROM BOARD
START WITH BO_NO = 174
CONNECT BY PRIOR BO_NO = BO_PARENT
) B ON (A.BO_NO = 174)
WHEN MATCHED THEN
UPDATE SET
BO_TITLE = '삭제된 글'
,BO_CONTENT = '삭제된 글의 내용'
,BO_DELETE = 'Y'
DELETE WHERE B.CNT = 1;
상태 컬럼의 필요성
ALTER TABLE BOARD
ADD (BO_DELETE CHAR(1) DEFAULT 'N');
- 삭제된 글은
- a링크가 없어야하고
- 상세조회가 되면 안됨 (리플, 답글이 가능해지기떄문)
스프링에 들어가기 전...
- 수업 진행 순서: IOC -> MVC -> ORM -> AOP
- 그외: websocket, security, batch
기존 레이어드 아키텍쳐의 문제점
- MermberServiceImpl에서 의존성때문에 MemberDaoImpl을 new로 생성하며 결합력을 너무 크게 발생시키고 있음
- oracle에서 mysql로 db로 바뀐다면?
- mybatis에서 ibatis로 바뀐다면?: memdao1을 2로 바꿨을때 service도 전부바꿔야함
- HCLC(High Cohesion, Loose Coupling)
- 레이어드아키텍쳐, solid 를 따르는 이유: 응집력 높이기위해
- BoardServiceImpl에서 sqlSession(persisten layer의 프레임워크 mybatis의 api) 사용중 -> persistence layer framework 변경시에 business logic layer까지 변경해야하는 상황 발생 -> 전혀 HCLC 스럽지 않다
private IMemberDAO dao = null;
이게 오늘 수업 목표
해결방안: Dependency Injection
private IMemberDAO dao = null;
public void setDao(IMemberDAO dao) {
this.dao = dao;
}
- 반드시 주입자가 필요함
- 서비스와 다오간의 있던 결합력이 주입자와 다오임플 사이로 결합력이 옮겨가게됨
- 주입자가 어플리케이션 내부가 아닌 어플리케이션 외부에 존재한다면 내부에는 결합력이 없게됨
- spring의 di컨테이너가 도와줄거야!!!!
Spring Framework
- 엔터프라이즈 지원형 프레임워크
- 스프링 전체를 통틀어 변하지않는 원칙 위주로 수업진행예정
- Provides core support for
- dependency injection
- transaction management
- web apps: handler mapping ,handler adapter..
- data access: dao 쉽게 구현할수 있도록 기술 지원 = mybatis필요없을정도
- messaging: 어플리케이션과 어플리케이션 사이에서 푸시메시지 구현, 메시지브로커, 메시지서버 필요 (우린 웹소켓으로 대체)
- 우리나라에선 5.대를 잘 안써서 4.3.30 버전으로 할 것
참고사이트
reference doc: 매뉴얼북
core
- IoC(Inversion of Control: 제어의 역전) => DI(Dependency Injection: 의존 관계 역전)
- Resources
- Validation
- 우리가 hibernate validator를 위해 만든 common validator의 대체품
- Experssion Language
- Aspect Oriented Programming (아마 제일 낯선 주제가 될것)
- 장점
- aop 사용시 어떻게 결합력이 낮아지는지?
- Aop의 연장선
testing
Spring 역사
- Rod Johnson의 논문: Expert One-on-One J2EE Development without EJB
EJB: Enterprise JavaBeans
- 대규모 어플리케이션 프로그램 개발시 모든 규칙 및 스펙의 집합 = EJB
- EJB에서 가장 유명한 것이 JavaBean규약
- 오라클,ibm,del이 모여 협의체 구성하여 규약을 만듬, 자기네 회사에 유리한 쪽으로 제안서 제출, 합의점도출이 어려워서 제안서 정리안한채로 그냥 다 집어넣어서 만듬
예시
- 4세대 국종망(국가관세종합정보망)프로그램.. 관세청프로그램 개발자 연2000명
- 각자 개발자는 자기가 선호하는 기호에 맞춰 개발한 후 2000명분의 코드를 합치는건 쉬운 일이아님 -> 룰과 가이드가 있어야 함 -> 이럴때 EJB가 적용됨
EJB vs. Spring
- 스프링은 가볍다, EJB는 무겁다 -> 모듈화를 통해 가볍게
- 스프링에 필요한 JAR파일이 전부 쪼개져있어서 필요한 것만 넣으면 됨
- POJO에 기반한 스프링
- EJB의 엔티티빈이 실패작이었으나 지금은 확장되어 만들어진 JPA로 종종 쓰임
- Spring은 실패작인 엔티티빈이 없고, MYBATIS와 비슷한 모듈을 지원하고, 개발자가 MYBATIS를 쓰고싶어한다면 연동을 지원하는 프로그램이 있음, EJB는 자기 모듈만 OK
- EJB가 하라는 대로 하면 성능은 잘 돌아가지만 그렇게 하기가 쉽지않음
- EJB컴포넌트를 만들고 다른 서버로 옮기면 돌아가지않음 하지만 스프링은 POJO로 만들기때문에 뽑아서 옮기는게 좋음 = 확장성이 좋음
Spring 소개
- JavaEE 기반의 어플리케이션 개발을 쉽게 해주는 오픈 소스 어플리케이션 프레임워크
- 전체 애플리케이션을 체계적으로 엮어낼(wire up) 수 있는 프레임워크
- POJO기반의 개발을 통해 의존적인 코드 없이 Bean들에 대한 생명주기를 관리
- 트랜잭션 관리를 위한 일관된 방법을 제공
- O/R mapping : Hibernate, iBatis, JDO등과의 연동 시의 필요 작업 최소화
- Lightweight Container 로 시작 시 부하가 적음
- 서블릿 컨테이너: 서블릿의 라이프사이클을 관리하는 관리자
- 스프링은 객체를 관리하고, 그 객체를 Bean이라고 부른다
- 스프링 = DI Container, IoC Container...
- 다양한 3rd 파티 제품과의 연동: 스프링은 레고....
- 테스트의 용이성: junit과 같은 단위테스트 연동모델과 지원
- 기존에는 웹상의 접점이 없어서 controller의 테스트를 할 수 없었지만 스프링에서는 mock 객체를 통해 controller 테스트도 가능
- webmvc라는 테스트모듈도 사용해 볼 것
Spring의 기본 전략
- POJO 를 이용한 가볍고 가능한 비침투적인(non-invasive)개발
- DI 와 인터페이스 지향을 통한 느슨한 결합도(loose coupling)
- Aspect 와 공통 규약을 통한 선언적 프로그래밍
- Aspect 와 템플릿을 통한 상투적인 코드의 축소.
Overview
Core Container
Module
- 사각박스하나가 jar라고 생각해보자
- EL은 코어가 있어야함 el과 코어에게 의존중
- beans는 코어가있어야함
- beans를 넣으면 asm, core까지 따라옴
- 그럼 context를 넣으면 전부 따라옴
- 모듈을 쓸 때도 의존관계를 생각하고 받아야함!
IoC, DI
DI
- 꼭 있어야해: 생성자 주입
- 옵셔널: setter
- 주입자가 어플리케이션 내부에 있느냐? 외부에 있느냐?
- 내부에 있다면 주입자와 주입당하는 자 간에 결합력 발생
- 외부에 있다면 결합력이 발생하더라도 외부에서 발생
기타
- 나가서 쓸 프레임워크는 많은데 왜 꼭 spring일까?: 전자정부
- 스프링을 통해 트랜잭션을 관리: 선언적 프로그래밍?
- batch: 탈퇴처리시 인터랙션이 없는 시간대에 데몬스레드로 해야함
- encryption/decriptyon: 싸이퍼==jasypt
- FileUpload/Download
- Marshalling/Unmarshalling
- ObjectPooling==커넥션풀링
- ServerSecurity: spring security, 접근제어필터
디자인패턴
- 왜 디자인패턴을썼을까?
- 하나의 레이어 내에서 응집력높이기위해
Factory Object Pattern
- 공장객체 사용의 장점
- 없으면 커넥션 생성 코드가 흩어져있음, db관련 정보가 바뀐다면 모든 코드가 변경되어야함
Facade Pattern
- 빔과 리모콘
- 빔프로젝터마다 다른 인터페이스를 가지고 있는데 그걸 다 알아야함(결합력 발생)
- 리모콘에 대한 공통적인 사용방법은 동일하게 맞춰져있기때문에 빔 자체를 몰라도 리모콘으로 사용가능
Strategy Pattern
- 우리가 사용해오던 HttpServletRequest는 인터페이스, 그 안에 어떻게 돌아가는지 전혀 모름
- 톰캣안에서는 ApachedTomcatMethod?라는 퍼사드가 만들어짐
- 전략에 해당하는 인터페이스만 맞춰놓으면 그 전략이 a라는 전략으로들어오든 b로들어오든 전혀 상관없음
- 전략패턴을 안 쓴다면 strategy가 아닌 ConcreteStrategy1이거나 2로 특정되어야함 = 결합력 발생
Template Method Pattern
- 템플릿메서드: 절차정의
- 콘크리트메서드: 구체적인 내용
Adapter Pattern