기본 콘텐츠로 건너뛰기

[JAVA][3일차]#1

 오전내용 못함


책 <스프링 퀵 스타트>


Q. 시퀀스로 만들어지는 경우, DB에서 가져올때 현재 아이디를 받아오고 싶음. 책 p 499

A. 인서트 + 셀렉트, 자바 안에서 리턴 타입을 Void가 아닌, Integer, String 등으로 세팅한다.


EX) 쇼핑몰 - 주문 상세와 주문 원장. 주문 원장이 Insert 되지만 이때의 ID가 주문 상세에 들어가야함. 


CDATA Section


크거나 작다, 작거나 등의 부등호를 쓸떄 사용해야함. p.501

p503의 LIKE 사용 방법 확인


전체 폴더구조

contents.vo = 객체 정의
contentsmapper.xml = SQL문 담고있음.
mybatis.xml = com.vo.아래 객체를 무엇이라 부를지 정의
                    매퍼의 위치 정의
com.dao = 한줄로 줄어들었음. 잘 모르겠다.
com.biz = ContentsBiz.java 이전의 Service 부분과 같은 역할인 듯. 스프링연결 되어있음.

dao부분 한줄로 모든 요청을 처리하는 방법인 듯... 어떻게? -> dao를 인터페이스로 설정했기 때문에 가능한 것.
Dao 밑에 두개가 있었지만, 오늘은 바로 한다. 완전히는 모르겠다.
dao를 인터페이스로 바꿧기 때문에 매퍼도 달라진다.

스몰 워크샵
vo아래 user 추가 후, app2를 이용하여 User에 대한 CRUD 구현.

세팅 부분 

    1. mybatis 아래에 usermapper.xml을 만든다
      1. SQL문 내용을 바꾼다.
      2. namespace를 바꾼다.
      3. resulttype도 바꾼다.
        1. 1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE mapper
          PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN"
          "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
          <mapper namespace="com.dao.UserDao">
              
              <insert id="insert" parameterType="user">
                  INSERT INTO USERS VALUES (CSEQ.NEXTVAL,#{title},#{content},SYSDATE,0,#{author})
              </insert>
              
              <update id="update" parameterType="user">
                  UPDATE USERS SET TITLE=#{title}, CONTENT=#{content} WHERE ID=#{id}
              </update>
              
              <delete id="delete" parameterType="Integer">
                  DELETE USERS FROM CONTENTS WHERE ID=#{k}
              </delete>
              
              <select id="select" parameterType="Integer" 
              resultType="contents">
                  SELECT * FROM USERS WHERE ID=#{k}
              </select>
              
              <select id="selectall" resultType="user">
                  SELECT * FROM USERS 
              </select>
              
              <update id="setcnt" parameterType="Integer">
                  UPDATE USERS SET CNT=CNT+1 WHERE ID=#{k}
              </update>
              
              <select id="search" parameterType="java.util.HashMap" 
              resultType="contents">
              <![CDATA[
                   SELECT * FROM USERS 
                   WHERE CNT > #{start}
                   AND CNT <= #{end} 
              ]]>
              </select>
              
          </mapper>
          cs
    2. Dao아래 frame을 이용하요 UserDao를 만든다.
      1. @Repository("udao")
        1. 1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          package com.dao;
           
          import org.springframework.stereotype.Repository;
           
          import com.frame.Dao;
          import com.vo.UserVO;
           
          @Repository("udao")
          public interface UserDao extends Dao<String, UserVO> {    
           
          }
          cs
    3. mybatis.xml에 usermapper의 위치를 추가(?)한다.
      1. 1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE configuration
        PUBLIC "-//mybatis.org/DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
        <configuration>
            <typeAliases>
                <typeAlias type="com.vo.ContentsVO" alias="contents"/>
                <typeAlias type="com.vo.UserVO" alias="user"/>
            </typeAliases>
            
            <mappers>
                <mapper resource="com/mybatis/contentsmapper.xml"/>
                <mapper resource="com/mybatis/usermapper.xml"/>
            </mappers>
        </configuration>
        cs
    4. Frame의 Biz를 이용하요 UserBiz를 만든다. 필요한 기능을 dao에 호출하는 기능.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.biz;
 
import java.util.ArrayList;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import com.dao.UserDao;
import com.frame.Biz;
import com.vo.UserVO;
@Service("ubiz")
public class UserBiz implements Biz<String, UserVO> {
 
    @Autowired
    UserDao dao;
    
    @Override
    public void register(UserVO v) throws Exception {
        dao.insert(v);
        
    }
 
    @Override
    public void remove(String k) throws Exception {
        int result = dao.delete(k);
        if(result == 0 ) {
            throw new Exception();
        }
        
    }
 
    @Override
    public void modify(UserVO v) throws Exception {
        int result = dao.update(v);
        if(result == 0 ) {
            throw new Exception();
        }
        
    }
 
    @Override
    public UserVO get(String k) throws Exception {
        UserVO user = null;
        user = dao.select(k);
        return user;
    }
 
    @Override
    public ArrayList<UserVO> get() throws Exception {
        ArrayList<UserVO> list = null;
        list = dao.selectall();
        return list;
    }
 
    @Override
    public ArrayList<UserVO> search(Object obj) throws Exception {
        // TODO Auto-generated method stub
        return null;
    }
 
}
 
cs
    
앱 테스트 부분

    1. get bean 부분을 ubiz로 바꾼다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.test;
 
import java.util.ArrayList;
import java.util.HashMap;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
import com.frame.Biz;
import com.vo.ContentsVO;
import com.vo.UserVO;
 
public class App2 {
 
    public static void main(String[] args) {
        System.out.println("App Start .......");
        AbstractApplicationContext factory = 
        new GenericXmlApplicationContext("myspring.xml");
        System.out.println("Spring Started .......");
        // IoC
                Biz<String,UserVO> biz = 
                (Biz)factory.getBean("ubiz"); // ubiz로 변경됨
            //get all
        ArrayList<UserVO> user = null;
        try {
            System.out.println(user = biz.get());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        factory.close();
        System.out.println("Spring End .......");
        System.out.println("App End .......");
 
    }
 
}
 
cs

  1. 비즈 부분에 트렌젝셔널 세팅 -> 인서트를 두개 동시에 하면, 안들어간다. 왜냐하면 아이디 중복. 

오류 유형

이름에 스페이스때문에 조회가 안되는 경우 


Q. 델레트나, 업데이트가 실패해도 app부분에선 그냥 실행된 것으로 뜸.

해결방법

Dao인터페이스의 해당 기능들을 int 리턴하도록 바꿈. -> Biz 부분에 가서 결과값을 int에 할당한 후, 0인 경우에 error 를 던지도록 세팅한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.frame;
 
import java.util.ArrayList;
 
public interface Dao<K,V> {
    public int insert(V v) throws Exception; //int로 바꾼것을 확인.
    public int delete(K k) throws Exception;
    public int update(V v) throws Exception;
    public V select(K k) throws Exception;
    public ArrayList<V> selectall() throws Exception;
    public ArrayList<V> search(Object obj) throws Exception;
}
 
cs

Dao 부분 


1
2
3
4
5
6
7
8
9
10
11
12
package com.dao;
 
import org.springframework.stereotype.Repository;
 
import com.frame.Dao;
import com.vo.UserVO;
 
@Repository("udao")
public interface UserDao extends Dao<String, UserVO> {    
 
}
 
cs

UserDao에는 내용이 없기때문에 바로 반영.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.biz;
 
import java.util.ArrayList;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import com.dao.UserDao;
import com.frame.Biz;
import com.vo.UserVO;
@Service("ubiz")
public class UserBiz implements Biz<String, UserVO> {
 
    @Autowired
    UserDao dao;
    
    @Override
    public void register(UserVO v) throws Exception {
        dao.insert(v);
        
    }
 
    @Override
    public void remove(String k) throws Exception {
        int result = dao.delete(k); // delete의 결과 값을 result에 할당한 후 만약 안되면 오류를 던지도록
        if(result == 0 ) {
            throw new Exception();
        }
        
    }
 
    @Override
    public void modify(UserVO v) throws Exception {
        int result = dao.update(v); //
        if(result == 0 ) {
            throw new Exception();
        }
        
    }
 
    @Override
    public UserVO get(String k) throws Exception {
        UserVO user = null;
        user = dao.select(k);
        return user;
    }
 
    @Override
    public ArrayList<UserVO> get() throws Exception {
        ArrayList<UserVO> list = null;
        list = dao.selectall();
        return list;
    }
 
    @Override
    public ArrayList<UserVO> search(Object obj) throws Exception {
        // TODO Auto-generated method stub
        return null;
    }
 
}
 
cs

UserBiz부분


댓글

이 블로그의 인기 게시물

[건축][소프트웨어] 프로그램 비교

 실무를 하면서 라이노와 그래스호퍼를 많이 쓰게된다. 그러다보니 관련 지식도 쌓이고, 나 나름대로 정리도 하며 공유를 위해 글을 쓰기 시작했다. 앞으로 계획은 라이노와 라이노 안의 파이썬 스크립트 또는 그래스호퍼 연동으로 자동화 관련해서 다루려고 한다.  그 전에 왜 라이노, 그래스호퍼 그리고 파이썬을 쓰게 되게 됬는지 프로그램들 비교 후에얘기하고자 한다. 비교하려는 프로그램들은 다음과 같다. Rhino(RobertMcNell & Associates) 3d experience (Dassault Systemes) Revit (Autodesk)  세 프로그램 모두 써볼 기회가 있었고, 사용 빈도는 다음과 같다 Rhino >= 3d experience(CATIA) >>>>Revit HTML 소프트웨어 비교 Rhino 3dExpereince Revit 가격 995$ (영구 라이센스) 9,000~65,000$(유지비 6,246$ / 년) 2,642,640원 / 년 첫 프로젝트 1994년 3월/ 25m 크기 보트 1977년 / 미라주 전투기 정확하지 않음 파라메트릭 모델링 x(그래스호퍼로 가능) O(자체 모델링 + EKL(내부언어) 등) O(자체 모델링 + Dynamo) Rhino : 최고의 가성비 프로그램 장점 : NURBs 모델링 가능, 가장 저렴한 가격, API/SDK를...

[건축]파사드 컨설팅이야기 - 1편: 파사드 컨설팅은 왜 필요한가?

 나의 약 1년 9개월간의 파사드 컨설팅을 중심으로 파사드 컨설팅 이라는 분야를 이야기 해보겠다.  파사드 컨설팅이란?  파사드 컨설팅은 우리나라에 다소 생소한 개념이다. 우선 Facade가 무엇인지 간략히 짚고 넘어갈 필요가 있다.  구글 검색에 facade를 치면 다음과 같은 정의가 나온다.  건물의 얼굴, 열린 장소 또는 거리에서 보이는 주 입면.  아주 간단하게 건물의 입면이라고 생각하면 된다. 그럼 왜 건물 입면에 컨설팅이 필요할까?  내가 참여하게 되었던 프로젝트를 생각해보며 적어보겠다. 파사드 컨설팅이 필요한 이유 1. 복잡해지는 형태  파사드는 건물의 외관이다.   즉, 누군가 건물을 봤을때 첫인상을 좌우하게 된다. 그래서 랜드마크나 기업 사옥을 건설할때 자주 건드리는 수단이 된다. 그리고 그 방향은 주로 DDP와 같이 유기적이거나 독특한 방향으로 가는 경우가 꽤나 있다. 박스에서 형태가 조금만 벗어나도 그것을 실체화 시키는데 큰 어려움이 따르게 된다. 특히 모든 프로젝트는 정해진 예산과 시간이 있기 때문에 이 제약조건 안에서 문제를 해결하려면 기존의 방법으론 불가능한 경우가 많다. 동대문 디자인 플라자. BIM과 비정형 사례로 항상 빠지지 않는다.  이 문제를 가장 깊이 고민하게 된 프로젝트는 <동대문 디자인 플라자>가 아닐까 생각한다. 업계가 좁은지라 이 프로젝트에 연관된 몇몇 분들을 만날 기회가 있었고, 그 중 외관(Facade)을 시공한 '스틸라이프' 대표님과는 영종도 프로젝트를 한적도 있다.  좌우지간, DDP는 삼성이 시공한 것으로 알려져 있지만 그 뒤엔 비정형 패널을 제작 설치하는데 특화된 '스틸라이프' 라는 업체와 파사드 컨설팅을 한 GT(Gehry Technologies)가 있었다.  프랭크 게리와 게리 테크놀로지스   수업시간에 들어봤을지 모르겠지만 게리는 Frank Gehry의 그 게리다. ...

일본 / 신오쿠보 / 도장집

신오쿠보에서 도장 만들기 1. 장소이전 이미 몇몇 블로그에서 정보를 찾아서 갔다. 하지만 문제는 장소를 이전했다는 사실이다. 또한 가격도 바꼈다. 다른 블로그에서 봤을 그 3층에 있고, 돈키호테 맞은편에 있는 도장집 겸 부동산집 2. 찾아가기 위치 〒160-0021 Tōkyō-to, Shinjuku-ku, Kabukichō, 2 Chome−19−11 新宿シャロームビル9F 다음과 같다. 히가시 신주쿠 역에서 서쪽(신주쿠방향)으로 걸어오는게 제일 빠르다고 나온다. 1층에 홍콩반점이 보이면 제대로 온 것. 3. 가격 변경 가격은 다음과 같다. 다른 블로그에서 엄청 쌋던거 같은데 조금 올랐다. 나 같은경우 한자로된 3글자 도장을 만들었고, 가격은 1000엔 들었다. 가격은 다음과 같은데 잘 나온느지 모르겠다. 여튼 이렇게 도장을 해결했다.