Spring - 33. 웹개발의 봄

갓김치·2021년 1월 5일
1

JSP+Spring

목록 보기
34/43

알바생 관리 풀이

쿼리 관련

전처리(?)

-- 샘플데이터 삽입을 위해 grant
GRANT SELECT ON MEMBER TO ALBA;
GRANT SELECT ON TB_ZIP TO ALBA;

-- 테이블 복사
CREATE TABLE TB_ZIP
AS
SELECT * FROM LKR94.TB_ZIP;

-- reply에 계층구조 
ALTER TABLE REPLY
ADD (REP_PARENT NUMBER(6));

merge 구문: update + delete구문

MERGE INTO BOARD A -- 타겟이 되는 보드 A
USING(
    SELECT COUNT(BO_NO) CNT
      FROM BOARD
    START WITH BO_NO = 174
    CONNECT BY PRIOR BO_NO = BO_PARENT
    -- ORDER SIBLINGS BY BO_NO DESC 조건으로 사용하는 VIEW이기때문에 ORDER BY 줄 수 없음
) B ON (A.BO_NO = 174) 
WHEN MATCHED THEN 
     UPDATE SET -- 타겟은 A로 이미 설정됨
     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

    1. IoC(Inversion of Control: 제어의 역전) => DI(Dependency Injection: 의존 관계 역전)
    1. Resources
    • 웹/파일/클래스패스리소스
    1. Validation
    • 우리가 hibernate validator를 위해 만든 common validator의 대체품
    1. Experssion Language
    1. Aspect Oriented Programming (아마 제일 낯선 주제가 될것)
    • 장점
    • aop 사용시 어떻게 결합력이 낮아지는지?
    1. Aop의 연장선

testing

    1. JUnit과의 연동으로 이루어지는 테스팅작업

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들에 대한 생명주기를 관리
    • DI컨테이너의 핵심
  • 트랜잭션 관리를 위한 일관된 방법을 제공
    • AOP와 연관
  • 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

  • pdf한번읽어볼것

Core Container

  • beans
  • core
  • el
  • context

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

profile
갈 길이 멀다

0개의 댓글