스프링 MVC

-컨트롤러, 
@Controller
@RestController

-입력, 
@RequestParam, @PathVariable, @Cookie
-출력
@ResponseBody

스프링 DI:Ioc Container/역제어/
@Component->@Service,@Repository,@Controller,@Configuration,@Bean
@Autowired

마이바티스(SQL 매퍼를 이용해서 JDBC를 대신 작성해주는 프레임워크)
@Mapper->@Select,@Insert,@...
XML ->resultType,resultMap,Dynamic Query <if><foreach>...

JUnit을 이용해서 테스트
Log 를 통해서 쿼리를 보는 방법

MVC구현과 3Tier(티어)[UI<->Service<->DAO]에서 필요로하는 기본적인 솔루션 2가지
-계층간의 사용방식
-UI에서 중첩되는 데이터 사용방식

스프링 트랜잭션
@Transactional


 

데이터베이스를 사용하기위해 다오

orm 나중에설명

셀렉트할떄 (값을가져올떄), 업데이트할때 고민되는 부분이있다

 

select * from notice where id = 3 (or id=5 or 9)

가끔은 이 쿼리문을 3이 아니라 3또는 5 또는 9 여러개를 담는 경우가 있다.

select * from notice where id in(3,5,9...)

1. 10번의 쿼리를 실행하고 10번위 데이터를불러와야한다.

또는 다오에게 아이디를 통째로주는것

 

다오 :sql대신, 필터링, 집계,정렬,배열선택

마이바티스는 해당시퀄이가능하도록 기능제공

 

아이디즈에서 하나꺼내서 item에 담는다.

(시작  )끝남

id출력

구분자seperator =","로 반복

 

colletion에는 배열이나 리스트만 온다

아이디를 배열에 전달
콘트롤러 / 마이바티스다오
매퍼 / 콘솔

foreach : 전달하는 ids를받아서 id하나를 꺼낸다. 쉼표를이용해 아이디를 반복하게해준다.

1
2
3
4
5
6
7
8
9
    <select id="getListIn" resultType="com.newlecture.web.entity.Notice">
        SELECT *
        FROM Notice
        WHERE ID in
        <foreach item="id" index="index" collection="ids"
         open="(" separator="," close=")">
            #{id}
        </foreach>
    </select>
cs

 

단위테스트 

junit 테스트툴

juit은 스프링이 아니다.

마이바티스는 스프링이랑 상관없다..

 

스프링은 BootPrjApplication클래스 실행 -> SpringApplication.run() 실행 -> 스프링깨어남 ->마이바티스 깨어남

스프링이 일어나야 컨테이너에 객체가 찬다.

스프링이 일어나야 마이바티스를 꺠운다.

 

테스트하고저ㅏ하는 클래스 선택- 마우스오른쪽 - 테스트유닛

스프링을 깨우지않은상태

test가 메인함수가 아니니까

실행자가 junit () 

@Test를 통해 실행해준다.

 

1.메인함수로 반환값확인

2.트레이스작업

 

런에즈- 제이유닛으로 실행

코드 : 이클립스가도와줌,

 

메크로함수테스트해보기


스프링이일어나야 객체들이찬다

 

마이바티스에 제이유닛플러그인을 ..

라이브러리추가

pom.xml에 추가

마이바티스가 이미 개발목적

테스트할떄사용하면 ,,,

http://mybatis.org/spring-boot-starter/mybatis-spring-boot-test-autoconfigure/index.html

 

 


사용자가 액션하면 ..

사용자행위가 그대로묻어난다

likeToggle

 

부품의부품화...잘못!

서비스가 서비스를 부품으로 xx -> 인터페이스라서 ?

/ 아마 오른쪽으로가게될것..(병목발생) ->고립화필요

남이만든 서비스를 쓰면 민폐를 끼칠수있다...협업에따라다름


대댓글기능

포이치안에 포이치

 


와스같은컨테이너가있다

엔터프라이즈자바빈

 

서비스에서 직접jdbc가편할수도있다..

AOP

어노테이션이 aop로 구현되어있다.

 

관점지향 프로그래밍

 

업무가 말했던것만 코드로 만들지않는다.

내가 만드는 내용중에는 업무로 분석된것이 아니라,

ex 성능에 문제가있다면 , 실행시간이 느린 함수체크를위해 로그기록, 시간을 재기위한 코드를 포함시키게된다.

관리자가 할일, 사용자가 할일 (조건처리필요)

 

프로그래밍은 업무외에 다른사람입장(새로운관점)이 필요하다.

개발자,운영자 목적

 

코드마다 똑같은내용발생.

노가다작업발생

->방법론나옴 AOP

 

업무자 + 다른관점 : 위아래에 꽂는다. 뺄수도있다

 

AOP관련용어

업무자/클라이언트/사용자 : 주업무, core concern , primary concern

부업무 :  cross cutting 방향성

 

크로스컷팅을 쉽게하기위한 방법론

 

객체지향안에 사용되는 함수안에서 쉽게 꽂고뺄수있는 방법론

 

한번만큼 코드를 직접하지않고 모든함수에 꽂아 줄 수 있니 ?

빵또아->아이스크림고 ㅏ빵 분리-> 위에있는 빵 실행 -> 안에실행 -> 밑에있는빵실행

 

Proxy준비 

 

메소드가 빵을 통해 core concern을 호출,사용

 

과거방식

AOP구현방식

 

오른쪽업무에는 proxy부분을 제외(분리)

proxy / 업무

 

가짜인스턴스생성.

거쳐서호출하기위한 핸들러

 

가짜의토탈(가짜의토탈 호출) 로드할때 이그젬인터페이스를통해 호출

 

aop는 방법론 : 업무로직+로그,권한,다양한 역할자관점을 코드에 넣다빼는방법

프락시로 객체를 호출

프렘워크마다 사용방법이다르므로 개념을알고있으면 사용시 ㄷ움말참저

 

트랜잭션도 이런 프락시를 제공하면서 사용


트랜잭션 특징

 

  • 원자성 (Atomicity)
  • 일관성 (Consistency) :데이터결함이 발생하지않게
  • 고립성 (Isolation)
  • 지속성 (Durability) : 커밋한 내용은 계속 저장되어야한다

억지로 두번의 업데이트를실행했었다

다완전히 ㅅ ㅣㄹ행되길원했었다

결과는 0이되어야했다

중간에오류가났는데 100이다.

 

 

 

 

@Transactional

오류가나면 위에 성공한것이 복구된다

원자성지켜짐

오류는 나지만, 데이터 hit가 처음값1으로 나온다

100이 적용된 후 0으로 덮어씌워져야하는데, 아이디오류로 아예 롤백되어 100, 0모두 적용이안되고

조회하면 원래값인 1이 조회된다.


트랜잭션 : 애ㅔ러나면 원래상태로복구됨

하위부분 호출에대한 트랜잭션 

+ Recent posts