저는 전에 데이터를 SELECT해와서 데이터가 0개면 INSERT하고, 있는 놈이면 해당 값을 업데이트 하는 식으로 했었는데요. 우연히 MERGE INTO라는 것을 알게 되었네요.

ORACLE에서만 되는 듯 하네요-_-; 9i이상에서만 된다고 하네요.

MERGE INTO의 목적은 어떤 테이블이나 뷰테이블을 해당 목표테이블과 합체(MERGE)하기 위한 목적인데요. 이걸 이용해서 데이터가 들어왔을 때 있는 데이터면 UPDATE하고, 없는 데이터면 INSERT하는 형태로도 쓰일 수 있습니다.

http://radiocom.kunsan.ac.kr/lecture/oracle/sql/merge.html
위에는 MERGE INTO를 잘 설명한 사이트네요.

여기서 조금 응용하면 원하는 대로 구현할 수 있습니다-_-;

MERGE INTO 테이블명  별칭
USING 대상테이블/뷰  별칭
ON 조인조건
WHEN MATCHED THEN
  UPDATE SET
   컬럼1=값1
   컬럼2=값2
WHEN NOT MATCHED THEN
  INSERT (컬럼1,컬럼2,...)
       VALUES(값1,값2,...);

MERGE INTO다음에 나오는 테이블명은 실제로 데이터가 들어가거나 업데이트 되는 테이블이구요.
USING 다음에 나오는 테이블명은 실제 데이터를 가져오거나 할 테이블이구요.
ON은 WHERE과 같은 조건문이죠.
WHEN MATCHED THEN은 매치되는게 있으면 UPDATE하라는 얘기구요.
WHEN NOT MATCHED THEN은 매치되는게 없으면 INSERT하게 되죠.

응용해봅시다.
[code]
           MERGE INTO INSERTTABLE
           USING DUAL
           ON (ID = 1)
           WHEN MATCHED THEN
           UPDATE SET
           DATA = 'idoori'
           WHEN NOT MATCHED THEN
           INSERT (ID, DATA)
           VALUES (1, 'mudchobo')
[/code]
INSERTTABLE이라는 곳에 USING은 DUAL이라고 했는데 DUAL은 dual은 1개의 레코드 만을 갖는 dummy 테이블이라고 합니다. select 1 from dual해버리면, 1이 나오죠. 대상테이블은 필요없으니 dual로 설정합니다.
ON에서 ID = 1은 ID가 1인게 만약 있으면, DATA부분을 idoori로 업데이트하고, 없으면 mudchobo로 넣게 되는겁니다.

아놔 별거 없는데 막 늘어썼네-_-;
 
Posted by 머드초보
,
 

넷빈즈는 초보자들이 쉽게 적응할 수 있도록 QuickStart를 제공합니다.
일종의 튜토리얼 같은 건데 참 잘 되어 있습니다.
스프링프레임워크에 관해서도 QuickStart가 있는데 어노테이션을 사용해서 더욱 쉽게 접근할 수 있도록 바꿔봤습니다.

http://www.netbeans.org/kb/61/web/quickstart-webapps-spring.html
요게 원문입니다. 영어지만, 그냥 코드만 보고 따라하셔도 스프링의 기초를 이해하실 수 있을껍니다.
이 예제를 조금 변경해봤습니다. 어노테이션을 이용한 HelloSpring으로-_-;(똑같이 하면 왠지 안될것같아서-_-)

우선 NetBeans6.1, JDK 5 or 6, GlassFish or Tomcat이 필요해요.

우선 처음에 프로젝트를 만듭니다.
New Project(Ctrl-Shift-N)을 선택해서 Web -> Web Application을 선택합니다.

프로젝트이름은 HelloSpring이라고 하고, Steps 4단계에서 Spring Web MVC 2.5를 선택하세요.
그리고 Finish를 클릭하세요.

그리고 F6을 누르면 GlassFish가 실행이 되고, 웹페이지가 뜨면서 아래와 같은 화면이 나올껍니다.

사용자 삽입 이미지


저 페이지는 index.jsp파일인데요. web.xml파일에 보면 welcome-file이 redirect.jsp로 되어있습니다. redirect.jsp파일을 열어보게 되면, index.htm을 요청하게 되어있습니다.
또 web.xml에서 servlet태그를 보면 *.htm요청으로 들어오는 놈들은 DispatcherServlet으로 넘기게 되어있습니다.
이 놈은 서블릿이름-servlet.xml파일을 설정파일을 사용합니다.
그러면 dispatcher-servlet.xml파일을 보게 되면, urlMapping이라는 bean이 있는데, 이 놈에서 mappings를 보면 index.htm이 요청일 경우 indexController를 실행하게 되어있습니다.
indexController는 아래에 bean으로 정의가 되어있죠.
indexController는 ParameterizableViewController클래스인데 이 클래스는 p:viewName값이 index인 것을 보여주는것이죠. index는 viewResolver bean에 의해서 /WEB-INF/jsp/index.jsp파일이죠.
그래서 index.jsp파일이 보여지는 것이죠.

초간단 설명을 마치고-_-; 폼에다가 이름을 입력하고, 전송하면 "Hello 이름!"을 리턴하는 프로그램을 만들어봅시다.

설정파일을 조금 변경해야합니다.
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
요런 bean이 있는데, 이건 Controller의 클래스명으로 url매핑을 하는 겁니다. 즉 HelloController로 선언을 시켰으면 hello.htm요청으로 해당 컨트롤러를 호출할 수 있게 하는겁니다.
근데 이건 어노테이션을 사용하면 안 먹힙니다-_-; 걍 지워버립시다.
그리고, beans에 xmlns:context="http://www.springframework.org/schema/context"를 추가합니다.
그리고, xsi:schemaLocation에도
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
이렇게 추가합니다. 이는 <context: 를 사용하기 위함입니다.
그리고, 이 아래에 이걸 추가합니다.
<context:component-scan base-package="hellospring" />
이건 객체를 스캔하는 건데 @Service, @Controller, @Component 등의 어노테이션이 base--package아래있는 클래스들 전부 적용하게 합니다. 빈이름은 클래스명에 따라서 정해집니다. 예를 들어 HelloController이면 helloController라고 자동으로 등록됩니다.
그리고, urlMapping bean에다가 우리가 만들 HelloController를 등록합니다.
<prop key="/hello.htm">helloController</prop> 이렇게 한줄을 추가하면 됩니다.
바뀐 dispatcher-servlet.xml 파일입니다.
[code]<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-2.5.xsd">
   
    <context:component-scan base-package="hellospring" />
   
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/index.htm">indexController</prop>
                <prop key="/hello.htm">helloController</prop>
            </props>
        </property>
    </bean>
   
    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />
   
    <bean name="indexController"
          class="org.springframework.web.servlet.mvc.ParameterizableViewController"
          p:viewName="index" />
   
</beans>
[/code]

우선 Service를 만들어봅시다.
Source Package에 오른쪽 버튼을 클릭하고, New -> Java Class를 선택합시다.
Class Name에는 HelloService라고 하고, Package에다가 hellospring.service라고 합시다.
[code]package hellospring.service;

@Service
public class HelloService {

    public String sayHello(String name) {
        return "Hello " + name + "!";
    }
}
[/code]
초간단 메소드입니다. name을 넣으면 Hello name! 을 리턴하게 하는 서비스입니다.

그 전에 폼으로 부터 데이터를 가져오는 bean을 하나 만들어봅시다.
Source Package에 오른쪽 버튼을 클릭하고, New -> Java Class를 선택합시다.
Class Name에는 Name이라고 하고, Package에다가 hellospring.domain라고 합시다.
[code]package hellospring.domain;

public class Name {
   
    private String value;
}
[/code]
여기서 getter, setter만드는 방법이 2가지가 있어요.

첫번째 방법은 Alt + Insert키를 누르면 Getter and Setter를 선택하면 해당 멤버변수에 대해서 나오는데 체크를 하고 Generate하면 됩니다.
두번째 방법은 소스에디터의 value에다가 마우스 오른쪽버튼을 클릭하고, Refactor -> Encapsulate선택하면 얘는 좀 더 상세하게 설정할 수 있습니다. 접근자를 수정할 수 있어요.
getter, setter가 완성이 되었습니다.

그 다음은 컨트롤러를 만들어봅시다.
Source Package에 오른쪽 버튼을 클릭하고, New -> Java Class를 선택합시다.
Class Name에는 HelloController라고 하고, Package에다가 hellospring.controller라고 합시다.
[code]@Controller
public class HelloController {

    @Autowired
    private HelloService helloService;
   
    private String formView = "nameView";
    private String successView = "helloView";
   
    @RequestMapping(method = RequestMethod.GET)
    public String hello() {
        return formView;
    }
   
    @RequestMapping(method = RequestMethod.POST)
    public String onSubmit(Name name, ModelMap model) {
        model.addAttribute("helloMessage", helloService.sayHello(name.getValue()));
        return successView;
    }
}
[/code]
여기서 보면 HelloService는 @Service라는 어노테이션을 사용해서 객체스캔으로 helloService라는 bean이름으로 등록이 되어있습니다. 그래서 @Autowired해버리면 helloService랑 자동으로 연결이 되죠.
그래서 helloService를 사용할 수 있습니다.

여기서 신기한 점은 @RequestMapping어노테이션이 있는데, GET방식이면 hello메소드를 호출하라는 겁니다.
그래서 처음에 form action을 하지 않은 상태에서는 hello메소드가 호출이 됩니다.
Controller어노테이션의 신기한점은 메소드의 리턴값이 String인데 이 값이 view이름이 됩니다.
formView는 nameView라고 적어놨는데, 이것은 viewResolver에 의해 nameView.jsp파일을 호출하게 됩니다.

더욱 신기한 점은 onSubmit메소드입니다. 값을 받아서 알아서 맞는 곳에다가 넣는 것 같습니다.
그리고 view에다가 값을 던져줄 때는 ModepMap이라는 클래스로 메소드파라메터에 넣고, 여기에 addAttribute를 해서 helloMessage값을 넣으면 됩니다.

이제 View를 만들어봅시다.
Web Page -> WEB-INF -> jsp를 선택하고 오른쪽 버튼 클릭, New해서 jsp선택.
formView이름을 nameView로 지었기 때문에 JSP File Name에 nameView라고 합니다.
[code]<body>
        <h2>Enter your name</h2>
        <form action="hello.htm" method="post">
            Name:
            <input type="text" name="value" />
            <input type="submit" value="OK" />
        </form>
    </body>
[/code]
action에서 hello.htm을 요청하는데 input필드는 한개입니다. 이름은 value입니다.
근데 신기하게도 우리가 만든 Controller를 보면 onSubmit에서 파라메터로 Name클래스로 받는 곳이 있습니다. 여기에 value멤버변수가 있는데 이름을 똑같이하면 그냥 Name클래스의 value값에 들어가버립니다-_-;

그럼 successView를 생성해봅시다.
Web Page -> WEB-INF -> jsp를 선택하고 오른쪽 버튼 클릭, New해서 jsp선택.
successView는 "helloView"라고 했기때문에 helloView라고 합니다.
[code]<h2>${helloMessage}</h2>
[/code]
라고 합니다. onSubmit메소드에서 넘겨주는 helloMessage값입니다.

그럼 이제 실행을 해봅시다.
http://localhost:8080/HelloSpring/hello.htm 라고 요청을 해봅시다.
그러면 Enter your name에다가 이름을 입력합시다.
이름이 나올껍니다.

사용자 삽입 이미지
사용자 삽입 이미지

아....자꾸 딴짓하네-_-; 일해야하는데-_-;

 
Posted by 머드초보
,
 

예전에 설치하다가 실패한 경험이 있어서-_-; 다시 해보았더니 이건 뭐 완전 쉽군요.
http://allting.egloos.com/1845643
이 분 포스트 보고 따라했습니다-_-;

우선 서브버전을 받습니다.
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
요기서 svn 1.4.6이 최신버전인 것 같습니다. 윈도우용 exe로 된 거-_-;
지가 알아서 설치해주는 버전으로 받아서 설치합니다.

설치하면 기본적으로 Program Files\Subversion\ 경로에 설치가 됩니다.

그 다음 저장소로 지정될 폴더를 만들어줍니다. 저는 C:\svn\mudchobo\ 경로를 생성했습니다.
그러면 이렇게 명령어를 써줘야합니다. svnadmin은 설치폴더에서 bin디렉토리에 있습니다.
[code]svnadmin create --fs-type bdb C:\svn\mudchobo[/code]
fs옵션이 파일시스템 옵션인데 보통 bdb로 하는 것 같아요-_-; 잘 몰라요 검색 고고싱~

해당 폴더에서 conf폴더에 보면 설정파일이 있는데요. svnserve.conf파일에 아래내용을 추가합니다.
위에 예시가 있어서 주석만 지우셔도 돼요.
[code][general]
anon-access = none
auth-access = write
password-db = passwd[/code]

설정 내용으로 보니, 익명접근자는 차단하고, 인증성공한사람은 쓰기권한이고, 비밀번호db는 passwd라는 파일에 있다라고 얘기하는 것 같습니다. 그러면 passwd에다가 계정을 추가해야합니다.
passwd파일을 열어봅시다.

[code][users]
# harry = harryssecret
# sally = sallyssecret
mudchobo = 1234[/code]
해리가 샐리를 만났을 때 인가요? 어쨌든-_-; 앞에는 아이디고 뒤에는 비밀번호입니다.
저렇게 지정해 두면 저 계정으로 로그인 할 수 있습니다.

설정이 끝났네요. 오 완전 쉽네. 그 다음에 이 놈도 서버인 관계로 서버를 실행해놔야돼요.
해당 bin디렉토리에 있는 svnserve.exe파일이 서버 실행파일입니다.
[code]svnserve -d -r c:\svn[/code]
요렇게 실행하게 되면, svn://localhost/mudchobo 로 접근이 됩니다.

이제 넷빈즈를 실행해봅시다.
넷빈즈는 이클립스처럼 subversive나 subclipse같은 플러그인 설치 없이 subversion Client를 내장하고 있습니다. 따로 플러그인 설치 안해도 됩니다.

프로젝트를 한번 만들어봅시다.
자바 프로젝트로 아무거나 한개 만든다음에, 프로젝트이름에 오른쪽 마우스를 클릭하고, Versioning선택하고, Import into Subversion Repository를 선택합니다.
Repository URL에는 svn://localhost/mudchobo 라고 합니다. 아까 우리가 만들었던 repository이름입니다.
User와 password는 passwd파일에 지정한 mudchobo와 1234를 넣어주면 됩니다.
Next를 누르면 Repository폴더를 작성하게 되는데 프로젝트명이랑 같게 해줍니다.
Specify the Message에다가 걍 뭐라고 써줍시다. 안써주면 Finish가 안돼요-_-;
Finish를 누르면 commit이 됩니다.

프로젝트를 지워버리고, 다시 가져오도록 해봅시다.
넷빈즈 메뉴에서 맨 위에 Versioning에 Subversion -> Checkout이 있습니다. 선택합니다.
Repository URL에 svn://localhost/mudchobo 아까 올렸던 주소를 쓰고,
User와 password에 mudchobo 1234를 넣습니다.
Repository Folders에 보면, 가져올 수 있는 폴더들이 보입니다.
방금 생성해서 커밋한 프로젝트가 있을 껍니다. 그걸 선택합시다.
그러면 CheckOut이 되었습니다. Open Project를 해서 가져온 프로젝트를 열어봅시다.
그러면 된 겁니다-_-;

이상!-_-;

 
Posted by 머드초보
,
 
사용자 삽입 이미지
간만에 MC THE MAX카페 월아에 갔었습니다.
콘서트를 한다고해서 보니까 트리플 콘서트라고 되어있네요.
셋이서 같이 하는 콘서트인듯합니다.

근데 신기한 조합입니다.

동방신기, 문희준, MC THE MAX.....

오....새로운 조합인데?-_-;
한번 가보고 싶지만... 음....갈까....-_-;

 
Posted by 머드초보
,
 

클라이언트에서 ajax로 요청했을 때 자료를 손쉽게 파싱하기 위해서 json으로 클라이언트에 던져줄 때가 편할 때가 있습니다. 그래서 손쉽게 json으로 변환하는 라이브러리가 있습니다.

http://json-lib.sourceforge.net/

여기보면 json-lib라는 놈이 있는데 json으로 손쉽게 변환해주는 라이브러리입니다.

  • jakarta commons-lang 2.3
  • jakarta commons-beanutils 1.7.0
  • jakarta commons-collections 3.2
  • jakarta commons-logging 1.1
  • ezmorph 1.0.4

    이것들이 필요하다더군요. 위에 4개는 apache에 가면 있구요. ezmorph는 구글링해서 찾아서 받으세요.
    그리고 JSON-LIB인 json-lib-2.2.1-jdk15.jar가 필요합니다.

    사용법은 매우 간단합니다.
    [code]
    public class JsonTest {
     
     @Test
     public void Bean2Json()
     {
      MyBean myBean1 = new MyBean();
      myBean1.setId(1);
      myBean1.setName("mudchobo");
      MyBean myBean2 = new MyBean();
      myBean2.setId(2);
      myBean2.setName("shit");
     
      List<MyBean> mybeanList = new ArrayList<MyBean>();
      mybeanList.add(myBean1);
      mybeanList.add(myBean2);
     
      JSONArray jsonArray = JSONArray.fromObject(mybeanList);
      System.out.println("mybeanList - " + jsonArray);
     
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("beanlist", jsonArray);
     
      JSONObject jsonObject = JSONObject.fromObject(map);
      System.out.println("json - " + jsonObject);
     }
    }
    [/code]
    Bean 2개를 List에 add를 한다음에 JSONArray라는 객체가 List를 배열로 만드는놈입니다.

    mybeanList - [{"id":1,"name":"mudchobo"},{"id":2,"name":"shit"}]

    이런식으로 만듭니다.
    저거를 JSONObject클래스를 이용해서 앞에 이름을 붙여줍니다. Map을 이용하면 됩니다
    Map을 이용해서 put에서 첫번째 인자에 이름을 넣고, 두번째 인자에 방금 생성한 Array를 넣으면 됩니다.
    그리고 JSONObject.fromObject메소드를 이용해서 생성하게 되면 이렇게 됩니다.

    json - {"beanlist":[{"id":1,"name":"mudchobo"},{"id":2,"name":"shit"}]}

    이상입니다-_-;

  •  
    Posted by 머드초보
    ,