ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 22-09-26_jsp(1)
    카테고리 없음 2022. 9. 26. 12:42

    2.

    jar 와 framework의 차이?

    둘 다 jar 파일로 되어 있음

     

    어쨌든 maven은 이것들의 관리를 도와줌. 

     

    3.

     

    ---

    maven을 쓴다는건, pom.xml을 건든다는 것

    ---

     

    또한 persistence Framework 라고도 한다

    또 InversionOfControl 이라고도 함 (제어역전구조)

     -> 원래는 제어권이 개발자인 우리한테 있는데, framework쪽으로 간 것

     

    jar 파일 하나를 쓰더라도, 

     

     

    ---

    이것도 만드는데, 만들 때, "mybatis-3-config.dtd" 가 연결되어있음. 이 dtd 파일에 등록된 element만 사용할 수 있음. 

     

    mybatis가 connetction을 대신 수립해줌. 그러면 이제 statement도 생성할 수 있어야 하는데, 그러면 query문을 가져야 함. 아래에 member.xml

     

     

    쿼리문까지 다 등록되어 있음. 

     

     

    --

    이제 이 configuration 파일을 읽어들일 수 있는 builder가 하나 필요했음. 

     

     

    이거임

     

     

    위치를 설정해서 불러왓고, static 코드블럭에 두었음. 

    딱 한번만 로딩됨.

    빌드도 한번만 됨. 

    그래서 application 안에서 singlton임,..,.

     

    --

    이제 dao로 넘어감

     

    싱글톤으로 된 빌더를 박아오고, 

    각 세션마다.. 열어주고....

     

    이것. 세션 오픈할 때부터 클로즈할 때까지의 한 과정을 하나의 transcation이라고 함,

     

    쿼리객체... 여러개가 만들어짐

    그래서 collection으로 관리하는데 mybatis는 이걸 map으로 관리하고 ㅡmap은 key가 필요함. 

     

    이게 key 역할을 해서

    이렇게 부를 수 있음....

     

    --

    inline-parameter를 이용해서 reflection을 활용

    mybatis는 reflection을 아주 다양하게 활용함. 

    그래서 code assist 를 받아보면 

     

    --

    다양함

    --

    mybatis에서 중요한건 mapper. 그리고 이게 작동하려면 namespace가 중요. 

    해당 layer에서 이걸 사용하는 dao의 qualified name을 을 넣으면 (이때 구현체가 아니라 interface가 필요 왜? proxy 객체를 생성하기 위해서임. 그러면 id 를 자동으로 받아올 수 있음. 

     

    --

     

    update와 delete를 완성하고 test case를 통해 동작 확인하기. 

    우리는 지금 view가 안 도니까(server를 안 돌리니까). test 로 확인하기.

     

     

    ---

    지난시간에 configuration에러가 났었져. 어케 해결할까여? 전자정부 프레임워크에서 제공하는 모양으로 안만들어서 그렇다고 함. 제공하는 모양대로 만들어봅시다.

    이전에 만들었던 configuration의 내용을 <configuration> 태그 내용물만 복사 해 두고, 삭제합니다. 

     

    이쪽에 보면 opern perspective 가 있음 이걸 눌러서

    eGovFrame 을 눌러주면

     

    이런 탭이생기는데 눌러서 

    ---

     

    요렇게 mapper configuration을 눌러서 새로 만들어 주면 됩니다. 

     

    원래 있던 것처럼 이 경로에 만들어 줍시다. 

     

    configuration  tag 부분 붙여넣기

    그럼 이제 에러가 안납니다^^!

     

    ---

     

    이제 xml 에 가서 보면 얘는 

     

    파란건, null 안뜨게 EL 써주고, 빨간색. date는string으로 받아오니까, date로 타입을 정해주고 저 형식으로 parsing해줍니다. 

     

    --

    그리고 parameter type을 아무거나 쓰는게 아니라 

    parameter type은 연결된 signiture 따라감

     

     

     

    String임 그러면 따라서 String으로 작성. 

    --

    그리고 parameter에 annotation을 이용하여 

    이름 부여 가능

    이렇게 @Param 어노테이션을 달고, 이름을 memId로 설정 해두면

     

    이렇게 code assist에서 이름으로 꺼내올 수 있음

     

     

     

    ---

    insert로 해도 실행됨 select와 not select 로 나뉘니까. (나중에 다른 점이 있는데, 그건 오늘 수업 마지막쯤에 알 수 있음)

     

    --

    쿼리아이디 ("kr.or.ddit.member.dao.MemberDAO.selectMemberList") 를 직접 쓰다보면 오타날 확률 높음

     

    오타 많이나서 이걸 해결해주는게 

    mapper proxy??

    @Override
    	public int insertMember(MemberVO member) {
    		try(
    			SqlSession sqlSession = sqlSessionFactory.openSession();	
    		){
    //			int rowcnt = sqlSession.insert("kr.or.ddit.member.dao.MemberDAO.insertMember", member);
    			MemberDAO mapper = sqlSession.getMapper(MemberDAO.class);
                //mapper로 가짜 구현체를 받아옴.
    			int rowcnt = mapper.insertMember(member);
    			sqlSession.commit();
    			return rowcnt;
    		}
    	}

    이렇게 가짜구현체를 받아서 하면 문자 쓸 곳이 없으니까 오타 자체가 안 남

    인터페이스가 중요. 

    xml의 mapper tag에 경로가 잘못설정되거나 오타가 나면, 위처럼 mapper proxy 활용할 수가 없음

    안됨 걍

     

    가짜구현체 == proxy

     

    (과정)

    세션오픈,/ 가짜구현체인 proxy 받아오고 /나랑 같은 이름의 메서드 호출하고, /커밋 잘 하고 리턴함

     

    이게 반복인데, proxy를 전역으로 뺼수? 지금은 없음. session이 지역변수로 묶여서

     

    mybatis spanner? 라는걸 사용해서 해결할수도 있고. 한단계 더 나아가면 dao 구현체 자체가 사라지기도한다고...

    --

    이런식으로

     

     

     

    오늘 3개정도의 framework를써보자. 

     

    1) D.L에 Lombok 적용

        - VO 내용 바뀌거나 하면, toString, getter, setter 다 수정하고 새로 만들고 하기 번거로운데, 자동으로 관리해줌

    2) View Layer에  Tiles를 적용

    3) Hybernate Validate를 C.L과 D.L에 적용

       - 검증하는 기능을 또 분리해보자

     ++) 번외편으로. log4j와 Facade Pattern(리모콘)을 얹어서 사용해보자 

     

    ** Fecade pattern

    https://ko.wikipedia.org/wiki/%ED%8D%BC%EC%82%AC%EB%93%9C_%ED%8C%A8%ED%84%B4

     

    퍼사드 패턴 - 위키백과, 우리 모두의 백과사전

    위키백과, 우리 모두의 백과사전.

    ko.wikipedia.org

     

    ----------

    Lombok 적용 위해

    멤버 + 멤버가 구매했던걸(cart,prod,lprod,buyer) 같이 보자

     

    ---

    cart 테이블을 구매했다. 는 가정으로 활용하자. 

    member, prod, cart 세개 테이블 필요

     

    --

    a001 사용자의 기본정보와 구매기록(구매상품ID, 상품명, 판매가, 마일리지)를 동시 조회

     

    --

    조회가 되는 사람은 a001 이 아니라 m001이어야 함. 사용자의 기본정보 나와야 하고

    ---

        --과제1
        SELECT  A.MEM_ID as 사용자ID,      
                A.MEM_NAME as 사용자이름, 
                A.MEM_MILEAGE as 사용자마일리지,
                C.PROD_ID AS 상품ID,
                C.PROD_NAME AS 상품이름,    
                C.PROD_SALE AS 상품가격
        FROM MEMBER A LEFT OUTER JOIN CART B
        ON (A.MEM_ID = B.CART_MEMBER)
        LEFT OUTER JOIN PROD C
        ON (B.CART_PROD = C.PROD_ID)
        WHERE MEM_ID = 'a001';
        
        --과제2
        SELECT  A.MEM_ID,      
                A.MEM_NAME,
                A.MEM_MILEAGE,
                C.PROD_ID,
                C.PROD_NAME,    
                C.PROD_SALE
        FROM MEMBER A LEFT OUTER JOIN CART B
        ON (A.MEM_ID = B.CART_MEMBER)
        LEFT OUTER JOIN PROD C
        ON (B.CART_PROD = C.PROD_ID)
        WHERE MEM_ID = 'n001';

    저는 이렇게짯어여

    쿼리문 실행 결과

     

     

     

    --

    쿼리 짤 때 어려운 이유가 순서를 몰라서 어려운 경우가 많음. 

     

    실행되는 순서대로 짜야 편안.

    from절 먼저 기록~~, 필요한 컬럼들은 제일 마지막에 함.

    -- 해당 결과를 만들어내는 순서를 따라가면 복잡한 쿼리도 짜기 쉬움. 

     

     

    --

        SELECT MEM_ID, MEM_NAME, CART_PROD
        FROM MEMBER INNER JOIN CART
        ON (MEM_ID = CART_MEMBER)
        WHERE MEM_OD = 'n001';

     

    이런식으로 inner join 하면 구매기록 없으면 멤버가 있음에도 조회가 안 됨(교집합만 나오니까). 그러면 outer join 해야 함, (차집합도 표시되도록)

     

    OUTER 조인 하면

        --서로 관계없는 테이블 두개 join 하려면 equi나 natural join...
        --관계 entity.... 
        
        --a001 사용자의 기본정보와 구매기록
        --(구매상품ID, 상품명, 판매가, 마일리지, 상세정보)를 동시 조회   
        
        SELECT DISTINCT MEM_ID, MEM_NAME, CART_PROD
            , PROD_NAME, PROD_DETAIL
        FROM MEMBER LEFT OUTER JOIN CART
            ON (MEM_ID = CART_MEMBER)
            LEFT OUTER JOIN PROD
            ON(CART_PROD = PROD_ID)
        WHERE MEM_ID = 'a001';
        
        DESC PROD;

    잘 나오지만 , 이제 중복제거 하려고 DISTINCT를 넣으면 

    --

     

    CLOB 에러가 남.

     

    CLOB, BLOB에서 중복을 판단하려면, 그 안의 데이터를 비교해야 하는데, LOB는 Large Object임. 데이터 크기 자체가 커서 이걸 비교한다는거 자체가 어려워서 중복여부 판단이 안 됨

    그래서 CLOB, BLOB에는 DISTINCT 못 씀

     

    --지금 상품 구매가 아닌 구매기록이 중복됨. 

    그러면 중복되는 데이터에서 중복을 빼고 조인하면 되지 

     

     

    --

    SCALAR QUERY (SELECT 절에 중첩쿼리)

    조건절에 들어가면 SUBQUERY

     

    ---

    이렇게 중복 제거해서 테이블 만들면, 조인하는데 문제가 없죠

     

    이렇게 중첩쿼리로 중복 없애주고 실행 하면

     

    이렇게 잘 나와요

     

    아래는 sql 전문

    --서로 관계없는 테이블 두개 join 하려면 equi나 natural join...
        --관계 entity.... 
        
        --a001 사용자의 기본정보와 구매기록
        --(구매상품ID, 상품명, 판매가, 마일리지, 상세정보)를 동시 조회   
        
        SELECT MEM_ID, MEM_NAME, CART_PROD
            , PROD_NAME, PROD_DETAIL
        FROM MEMBER LEFT OUTER JOIN (
            SELECT DISTINCT CART_MEMBER, CART_PROD
            FROM CART
        )
            ON (MEM_ID = CART_MEMBER)
            LEFT OUTER JOIN PROD
            ON(CART_PROD = PROD_ID)
        WHERE MEM_ID = 'a001';
        
        DESC PROD;

    --

     

    ㅎㅎ...????뭔가 (10:53am) 어케 하라고 하셨는데 놓침

    (FROM절을 먼저 고민해보고, 

     

    --

    IN-LINE VIEW가 코드 가운데 들어가면 가독성이 떨어짐. THIS 절을 쓸 수있음. (?)

     

    --

    INNER JOIN으로 해결하는 방법도 있대요

     

    --

        WITH CARTPROD AS(    
            SELECT CART_MEMBER, PROD_ID, PROD_NAME
                    --구매한 적 없는 상품은 필요 없으니 INNER JOIN
            FROM CART INNER JOIN PROD ON (CART_PROD = PROD_ID)
        )

    IN-LINE VIEW 로 만든 것에 이름을 부여 ('WITH ~ AS ()' 활용 )

     

    이렇게 나옴

     

     

     

        WITH CARTPROD AS(    
            SELECT CART_MEMBER, PROD_ID, PROD_NAME
                    --구매한 적 없는 상품은 필요 없으니 INNER JOIN
            FROM CART INNER JOIN PROD ON (CART_PROD = PROD_ID)
        )
        SELECT * 
        FROM MEMBER LEFT OUTER JOIN CARTPROD ON (MEM_ID = CART_MEMBER)
        WHERE MEM_ID ='a001';

     

     

    이렇게 됨.. 중복도 제거하자면...

     

     -- WITH절에 COMMA 로 한번에 여러개의 IN-LINE VIEW를 만들 수 있음
        WITH CARTVIEW AS
        (
            SELECT DISTINCT CART_MEMBER, CART_PROD
            FROM CART
        )
        , CARTPROD AS(    
            SELECT  CART_MEMBER, PROD_ID, PROD_NAME, PROD_DETAIL
                    --구매한 적 없는 상품은 필요 없으니 INNER JOIN
            FROM CARTVIEW INNER JOIN PROD ON (CART_PROD = PROD_ID)
        )
        SELECT * 
        FROM MEMBER LEFT OUTER JOIN CARTPROD ON (MEM_ID = CART_MEMBER)
        WHERE MEM_ID ='a001';

    이렇게 하면 됨

    --

    자 이제

     --a001 사용자의 기본정보와 구매기록
        --(구매상품ID, 상품명, 판매가, 마일리지, 상세정보, 거래처명, 분류명)를 동시 조회

     

    2개의 테이블을 더 넣어야 해요 총 5개 (MEMBER ,    CART,    PROD,    BUYER,    LPROD) 조인하는거임

     

    PROD,    BUYER,    LPROD 얘네 세개가 먼저 JOIN 해야 해요

    CART 를 대상으로 중복 제거 해 주고요

    마지막에 a001 (MEMBER)의 기본정보 필요)

     

    --

     

    먼저 이렇게 해요. INNER JOIN이나 OUTER나 상관이 없어요. 

    필수요소니까여, 차집합 부분이 필요 없으면 INNER 필요하면 OUTER

     

     

    잘나옴

    --PROD_BUYER(PROD), BUYER_ID(BUYER) -- BUYER_NAME (거래처명)
        --PROD_LGU(PROD), LPROD_GU(LPROD) --LPROD_NM (분류명)
    
        
        WITH PRODVIEW AS(
            SELECT PROD_ID, PROD_NAME, BUYER_NAME, LPROD_NM
            FROM PROD INNER JOIN BUYER ON(PROD_BUYER = BUYER_ID)
                      INNER JOIN LPROD ON (PROD_LGU = LPROD_GU)
        ), CARTVIEW AS(
            SELECT DISTINCT CART_MEMBER, CART_PROD
            FROM CART
        ), CARTPROD AS(
            SELECT *
            FROM CARTVIEW INNER JOIN PRODVIEW ON(CART_PROD = PROD_ID)
        )
        SELECT MEM_ID, MEM_NAME, CARTPROD.*
        FROM MEMBER LEFT OUTER JOIN CARTPROD ON (MEM_ID = CART_MEMBER)
        WHERE MEM_ID = 'a001';

    이거입니다

     

     

     

    --

    이제 이클립스에 가서 조회할것...

     

     

    --

    반복적으로 사용하는 VIEW는 IN-LINE VIEW 로 두지 말고, 미리 존재하는 VIEW로 둘 수도 있죠

     

     

    --

    자주 중복해서 사용하는 아래와 같은  쿼리문은 view를 생성해 둡니다

        CREATE OR REPLACE VIEW PRODVIEW AS
        SELECT PROD.*, BUYER.*, LPROD.*
        FROM PROD INNER JOIN BUYER ON(PROD_BUYER = BUYER_ID)
                  INNER JOIN LPROD ON(PROD_LGU = LPROD_GU);

    VIEW를 만들어 둘 수 있음. 

     

     

    --

    혹시 이런 에러 나면 권한이 없는거니까 권한을 부여해 줘야 함 (insufficient privilieges)

     

    이런 식으로 관리자 계정으로 접속해서 grant 명령어 이용하여 권한 부여해 주면 됨.

    ---

    그러면 이제 이 VIEW를 TABLE 처럼 쓸 수 있게 됨

    방금 만들었던 view를 열어보면 이렇습니다.

     

    그러면 좀전에 만들었던 QUERY문에 AS문을 없애보자 (같은 이름의 view가 존재해서, 지우기만 하면 됨)

     

    잘나옴

     

    --

    이제 이클립스에 추가 그런데

    이렇게 하면 조회는 잘 되지만, 저 블럭 씌운 것들을 담을 VO가 없음 지금. 

     

     

    Domain Layer의 역할은 entity, realtion, constraint를 다 담을 수 있어야 하는데 우리는 entity만 담아봤음. 

    그러면 나머지를 어떻게 D.L 에 반영하는가가 문제임. 

     

    그 중에 relation에 대한 부분을 반영 해 보자

    ---

     

    새 VO클래스를 만들자

    --

    코드조각을 이용해서 VO 코드를 sql devleoper에서 가져옴

     

    ---

    좌측에 outline보이죠 여기를 주로 볼꺼예요

    여기서부터는LOMBOK을 써봅시다

     

    Lombok을 적용하러 가 볼 거예요

    구글에 Project Lombok을 검색해 줍니다.

     

     

     

    https://projectlombok.org/

     

    Project Lombok

     

    projectlombok.org

     

    나중에 여기 홈페이지에 영상도 보세요 짧아요

     

     

    --

    저기 보면 이클립스에 어케 적용하는지 나오지만, 우리는 안해도 되어요. 전자정부프레임워크가 다 해줬어요 이미

     

     

    그걸 어떻게 아냐고요? 확인 어케하냐면

    우리 eclipse 깔아두었던 경로를 찾아가서 파일을 볼 거예요 

    저 속성을 통해 열어보면 위치를 알 수 있죠

     

    이렇게 설치된 위치가 있죠. 이 폴더를 열어서요

    여기 위치에 가서 

    eclipse.ini 파일 열어보면 아래와 같이 써 있는걸 볼 수 있음

    lombok이 이미 추가되어있져? 

     

    그런데 우리는 전자정부프레임워크 4점대를 써서 여기 미리 설정되어있는건데, 3점대를쓰면 안되어있는 경우가 많아요. 

    그러면 필드에 나가서 저기를 확인해보고, 안되어있으면 홈페이지에서 적용방법 보고 적용하세용

     

     

     

     

    이제 라이브러리 jar파일 필요함.  다운받나여? ㄴㄴ xml문만 우리 프로젝트의  pom.xml 파일에 추가해줍니다. 

    여기 latest 버전에서 xml script 를 copy 하고요

     

    아래와 같음

    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
        <scope>provided</scope>
    </dependency>

    근데 얘는 code를 생성(generation) 해주는 library라서 배포할 땐 안 가져가요 scope가 provided잖아여. provided가 그런 의미임

     

     

    이렇게 추가해주시고요.

     

    lombok 쓸 때는 좌측의 아웃라인을 잘 봐야해요

     

    annotation으로 쓰겠습니다. 

    annotation을 이용해서 메서드 자동으로 생성하기

     

    @Getter, @setter, @EqualsAndHashCode를 이용하면

    이렇게 별다른 작업 없이도 자동으로 만들어지죠

     

    다만 이제 @EqualsAndHashCode는 수정해줘야 해요

    primary kety(id)가 같으면 같은 객체로 판단할 수 있는 기준 필요하니까

    (수정해주지 않으면 모든 구성요소가 동일해야 동일하다고 판단함)

     

    이렇게 of 를 사용해서 넣어주면, 쟤만 같으면 동일객체로 판단합니다

    이렇게 처리해 주면 되고요 

     

    이제 @toString 어노테이션을 이용해서 또 만들어 주는데요

    toString에서 주의할 건, 출력하지 않을 것이 있음. 

     prodDetail; 같은 경우에는 BLOB이라 console에 출력하면 콘솔 터짐 빼줘야 함.

     

    이렇게 제외할 거는 exclude 속성을 이용하여 지정해줍니다. 

     

    --이렇게 쉽게 하면 됩니다. 

    그런데 이것도 귀찮다???

     

    @Data 어노테이션 넣으면 자동으로 다 들어가요. 

    다른 어노테이션들을 날리고 data 어노테이션 하나만 넣어줬는데, 좌측 Outline보면 다 생긴 걸 볼 수 있음

    --

     

    이제 생성자를 넣고 싶다? 명시적으로 생성자를 넣을 때는 @AllArgsConstructor

    어노테이션이 있음. 모든 요소를 parameter로 다 받는거. 그러면 이제 기본생성자가 사라짐. argument 가 없는 생성자를 다시 넣어줘야 함

    @NoArgsConstructor 어노테이션을 넣어주면 됨, 이건 아무것도 parameter로 받지 않는 기본생성자임.

    여기서 바꾸거나 해도 자동으로 적용됨. 편안. 

     

     

     

    다만

    * 주의1), 아래처럼 java Bean 규약에 따라서 만들어진다는 걸 기억하기.  (명명됨)

    *주의2) 직렬화는 우리가 선언해 줘야 함. 

    *주의3) 보호할 데이터나, 직렬화에서 제외할 데이터(BLOB같은 것) 직접 설정해 줘야 함

    * marshalling할 때도 제거해야 

     --아래 코드 참조

    직렬화, 직렬화 제거나 marshalling 제외 등을 지정해준다.

    Serializeble을 implements 해 주어 직렬화를 해 주고

    직렬화에서 제외할 것은 transient 속성을 추가로 넣어주고

    marshalling에서 제외할 것도 @JasonIgnore 어노테이션을 달아준다. 

     

     

    이제 하드코딩했던 MemberVO도 새롭게 적용한 Lombok으로 바꿔줍니다

    짠

     

     

    --

    이제 Entity를 표현할 수 있는 두개의VO가 생성되었으면 이 둘의 Relation이 설정되어야 함. 

    /**
     * 회원 관리(Domain Layer)
     * 
     * 한 사람의 회원에 대한 정보(구매기록이 포함 ->ProdVO를 포함해야)
     * has 관계
     * has A 관계 (1:1)
     * has Many (1:N)관계

    이러한 Relation이 존재함

     

     

    우리는 그럼 1:N관계로 만들어야 함  --> collection으로 관리되어야 함

     

    --

    이렇게 하면 1:1 관계 임

     

    이렇게 하면 1:N관계임 (List)

     

    근데 중복을 제거해야 하면 List 대신 Set 사용

    1:N관계, Set

    중복을 제거하느냐 안 하느냐에 따라서 타입이 바뀌기도 함. 이런 부분을 고려해서 설계하면 됨

     

     

    ---

    member.xml에 가서 보면

    resultMap이라는게 있는데, 만들어줘야함

     

    resultMap tag를 이용해서 설정해 주면 됨

    자동으로 binding 되던게 이제 이 map 안에서 수동으로 바인딩 되어야 한다는 것

     

     

    이렇게map에 하나하나 수동으로 넣어줌

     

    그런데 이렇게 간단하게 못 넣는건 collection으로 넣어준다.

    이렇게 collection tag로 넣어주고, 타입은 prodVO

    이건 prodVO여러개를 map으로 넣어줘 하는 의미

     

     

    조회된 컬럼의 갯수만큼 나올 수 있음

     

    --

    test해봅시다

     

    잘나옴

     

    --

    이제 사실 수동으로 하나하나 binding하기 귀찮져

    이런게 있어요

    automapping 가능. 손으로 안써줘도 됨.

    알아서 매핑해줌

     

     

    + 중복여부를 판단할 수 있는 것....

    구매기록 같은 경우에 중복여부 어떻게 판단? -> 아이디가 두 번 나오면. (PROD_ID) 중복. 

    그럼 code assist 받아보면 저런게 있어요

    id를 지정해 주면 됩니다. 쟤가 중복되면 중복인거로 판단됨. 

     

    -

    대신 이놈이 있어야 함. 안그러면 정책이 다른거니까 에러나겠져

    그런데 저 id를 설정할 때 그냥 쓴다고 다 되지 는 않고, VO에서 of 속성으로 같은 모양으로 설정해 줘야 한다. 

    안그러면 정책이 달라서 에러남. 

     

    --

     

    근데 테스트 해보면 에러가나요. 하나가 조회될 줄 알았는데 너무 많이 나온대요

     

    sql developer에서 해당 쿼리문을 보면 이럼. 데이터가 여러개가 나와서. 에러난거임

    저게 한명이 구매한거라는 걸 식별을 해 주어야 되는거 

     

    여기서도 이걸 넣어줘야 해요

     

    ** 이 id라는건 VO의 @EqualsAndHashCode(of=" ")라는 정책과 함께 맞춰야 한다..

    고치면 잘나옵니다^0^

     

    ---

     

    정리합시다

     

     * 2개 이상의 테이블을 조인하고 결과 바인딩하는 방법. 
     * 1. 대상 테이블 간의 관계 파악.	(메인 데이터를 가진 테이블이 1이 되어야 함, 현재는 member)
     * 			MEMBER(1) : PROD(N)
     * 			PROD(1) : BUYER(1)		//여기선 상품이 중요함main, 삼품1에 거래처1임.
     * 2. 각 테이블로부터 데이터를 바인딩할 VO정의  			//도메인 레이어에도 반영해야
     *		해당 VO간의 관계를 형성
     *		MemberVO, has Many ProdVO
     *		ProdVO has A BuyerVO
     * 3. 조인 쿼리 작성
     * 4. resultMap으로 결과 binding(수동)
     * 		has Many -> collection

     

    --

     

    buyer vo도 만들어 줍니다

     

    --

    lprod와 buyer 속성을 ProdVO에 DB의 sheme 관계대로 작성 해 줘서 

    관계설정을 완료해줍니다.

     

     

    또 이제 xml에서 설정을 완료해 줄건데

     

    이것도 간단한 반복로직이져

    autoMapping 처리를 해주면 됩니당

     

    그러면

     

    이렇게 BuyerName이 같이 조회됩니다.

    관계설정이 잘 되었다는 것이죠

     

     

     

    --

    이제 log4j 도 적용해볼거예요 logging 기술이예요

    이제 apache 사이트에 logging 을 찾아갑니다.

     

    이 log4j는 java뿐 아니라 kotlinm, scala 등 다른 언어들에서도 사용할 수 있어요

     

     

    우린 이제 이걸 가져올 떄

    우린 maven을 쓸거니까 이걸 긁어서
    넣어주고요

     

    --

     

    이제 또 SLF4J라는걸.... 가져올건데요

     

    https://logging.apache.org/log4j/2.x/log4j-slf4j-impl/index.html

     

    SLF4J Binding Using Log4j – Log4j 2 SLF4J Binding

    <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apa

    logging.apache.org

    여기에 접속하셔서요

     

     

    요놈을 검색해서 찾아줍니다. 저놈을 쓸거예요
    우리는 maven으로 쓸거니까요 이걸 또 mvnrepository에서 검색해서 최신버전 것을 xml코드를 긁어서, 맨 위에거예요

    넣어주되

     

    xml 코드에 포함되어있는 저 test 는 지워줍니다. 

     

     

     

    --

    넣었는데 Dependency hierarchy 보면, 의존하고 있는 라이브러리가 있음. 이것도 다운받으러 가자. 

    --

    저놈의 이름을 또 mvnrepository에서 검색해봅시다

    세번쨰 저놈을 쓸거예요
    dependency hierachy에서 본 것처럼, 1.7.25버전을 찾아서요
    넣어주세요

    끗

     

    -----

     

     

    이제 logging 실습을 해봅시다. apache 홈페이지에서

    여기 usage에서 보면

    이렇게 생긴 첫번째 예제를 찾아옵시다

     

    여기 xml파일을 만드는데, 이름이 중요하고요 저렇게 잘 적어주세요

     

    이렇게 만들어줍니다. 

     

    이제 daoimpl testcode를 다시 실행해줍니다. 

    그러면 log가 찍혀요

     

    이렇게 잘찍히죠

     

     

    근데 log가 너무 많은게 찍히져 어질어질합니다

     

    필요없는걸 제거해봅시다.

    레벨을 바꿔봅시다 그러면 찍히는게 달라질거예요

    그러면 이제 안뜨져?

    너무깔끔해졌죠

     

    이게 무슨 의미인지 이게 오후에 볼 거예요

     

    끝. 밥먹자

     

     

     

     

     

     

     

     

     

     

Designed by Tistory.