전시간에 이어서.....
이걸 좀 수정해봅시다.

우선 List를 받으려면 idx, 제목, 글쓴이의 정보가 필요합니다. 하지만, 기본적인 RESTful 웹서비스를 생성하게 되면 idx밖에 반환하지 않습니다. 이걸 고쳐봅시다.

boarddb.converter패키지에 WsboardsConverter클래스가 있습니다.
클래스 위에 XmlRootElement(name = "wsboards")라는 것이 붙어있습니다. 그렇습니다. 클래스형태가 바로 애노테이션 하나로 xml이 되버립니다-_-;(동작원리는 잘 모르겠네요-_-)
현재 데이터를 이런 식으로 반환합니다.
[code]<wsboards uri="http://localhost:9080/BoardWS2/resources/wsboards/">
    <wsboardRef uri="http://localhost:9080/BoardWS2/resources/wsboards/33/">
        <idx>33</idx>
    </wsboardRef>
[/code]
여기에 subject와 writer를 추가해봅시다.
wsboardRef쪽에다가 추가를 해야하니, WsboardRefConverter클래스를 봅시다.
@XmlRootElement(name = "wsboardRef")가 붙어있습니다. @XmlElement애노테이션을 붙이면 Element를 생성할 수 있습니다.
[code]@XmlElement
public String getWriter() {
    return entity.getWriter();
}
@XmlElement
public String getSubject() {
    return entity.getSubject();
}
[/code]
이렇게 2개를 추가했습니다. 그리고 게시판은 최근글이 마지막에 보여야하므로 쿼리를 수정합니다.
WsboardsResource클래스의 getEntities메소드를 봅시다.
쿼리를 아래와같이 수정합니다.
[code]SELECT e FROM Wsboard e ORDER BY e.idx DESC"[/code]
다시 테스트를 해봅시다.
이제 이렇게 나올겁니다.
[code]<wsboardRef uri="http://localhost:9080/BoardWS2/resources/wsboards/33/">
      <idx>33</idx>
      <subject>111</subject>
    <writer>11</writer>
</wsboardRef>[/code]
와우 List는 이제 구현이 다되었습니다-_-;

List를 가져올 때 총 게시물을 뽑아서 나중에 페이징을 할 때 사용해야합니다. 총게시물을 구하는 쿼리는
[code]SELECT count(e) FROM Wsboard e[/code]
이렇게 하면 되더군요.
그럼 WsboardsResource.java파일의 @GET부분을 다음과 같이 바꿉시다.
[code]try {
    Long count = (Long)PersistenceService.getInstance().createQuery("SELECT count(e) FROM Wsboard e").getSingleResult();
    return new WsboardsConverter(getEntities(start, max), context.getAbsolutePath(), count);
} finally {
    PersistenceService.getInstance().close();
}
[/code]
카운트값을 xml에 표기를 해야하니 WsboardsConverter를 수정해야겠죠?
[code]
private Long count; // 추가
public WsboardsConverter(Collection<Wsboard> entities, URI uri, Long count) {
        this.entities = entities;
        this.uri = uri;
        this.count = count;
    }
[/code]
count변수를 추가하고, 생성자를 저렇게 생성하도록 바꿉니다.
속성값으로 count를 추가해야겠죠?
[code]
@XmlAttribute(name = "count")
    public String getCount() {
        return count.toString();
    }
[/code]

이제 1개데이터 가져오기를 구현해봅시다. 사실.....이건 다 되어있군요. Test RESTful Web Service에서 {idx}에서 해당 idx를 넣고 Test눌렀을 때 정상적으로 나오면 된겁니다 ^^

이제 DELETE와 MODIFY 2개가 남았습니다.
DELETE를 구현하기 위해서는 db에 저장된 비밀번호와 입력한 비밀번호의 비교를 위해서 비밀번호를 받는 것을 하나 추가합시다. 저는 그냥 경로에 추가했습니다. 보안상 매우 안좋지만...-_-; 어떻게 하는지 몰라서-_-;

WsboardsResource.java파일에서 @Path("{idx}/") -> @Path("{idx}/{pwd}")로 바꿨습니다.
그리고, 1개의 PathParam을 받았던 것을 pwd도 받게 바꿨습니다. 그리고 WsboardResource클래스에 pwd를 추가하고, 생성자를 수정했습니다.

WsboardsResource.java파일
[code]@Path("{idx}/{pwd}")
public WsboardResource getWsboardResource(@PathParam("idx")
Integer id, @PathParam("pwd") String pwd) {  
    return new WsboardResource(id, pwd, context);
}
[/code]
WsboardResource.java파일
[code]private String pwd; //추가
public WsboardResource(Integer id, String pwd, UriInfo context) {
    this.id = id;
    this.pwd = pwd;
    this.context = context;
} // 생성자 수정
[/code]
이제 /wsboards/{idx}/{pwd}로 요청하면 idx와 pwd를 받을 수 있습니다.

DELETE를 수정해봅시다.
[code]@DELETE
public Response delete() {
    PersistenceService persistenceSvc = PersistenceService.getInstance();
    try {
        Wsboard entity = getEntity();
        if (entity.getPwd().equals(pwd)) {               
            persistenceSvc.beginTx();
            persistenceSvc.removeEntity(entity);
            persistenceSvc.commitTx();
            return Response.ok("success").build();
        }
    } finally {
        persistenceSvc.close();
    }
    return Response.ok("fail").build();
}
[/code]
간단합니다. 받은 pwd랑 현재 입력된 pwd랑 같은지 확인 후에 맞으면 지우고 success를 리턴하고, 틀리면 fail을 리턴합니다. 테스트를 해볼 수 있는데요. 한번 지워보시면
[code]Delete failed: Server returned --> Status: (200) Response: {success}
[/code]저는 이런 메시지를 받습니다. Delete failed라고 뜨는데요. 그래도 success라는 응답을 받고 db에서 보면 지워졌을 겁니다. 보면 DELETE는 뭔가 리턴을 하면 안되는 듯 합니다. 암튼...잘 되니...-_-;

이제 PUT을 수정해봅시다.
[code]@PUT
@ConsumeMime({"application/xml", "application/json"})
public Response put(WsboardConverter data) {
    PersistenceService persistenceSvc = PersistenceService.getInstance();
    try {
        Wsboard entity = getEntity();
        if (entity.getPwd().equals(pwd)) {
            persistenceSvc.beginTx();
            updateEntity(getEntity(), data.getEntity());
            persistenceSvc.commitTx();
            return Response.ok("success").build();
        }
    } finally {
        persistenceSvc.close();
    }
    return Response.ok("fail").build();
}
[/code]
이것도 그냥 pwd랑 같으면 수정시키고 success를 리턴하고, 틀리면 수정 안시키고 fail을 리턴합니다.
테스트해봅시다.
테스트할 때 주의사항이....xml로 데이터를 던져야 하는데요. idx빼고 모든 값이 다 들어가야합니다.
PUT으로 맞춰놓고, idx랑 pwd를 쓴 다음 content란에 이렇게 씁니다.
[code]<wsboard>
<pwd>1</pwd>
<writer>11</writer>
<subject>22</subject>
<content>33</content>
</wsboard>
[/code]
idx빼고 다 넣어야합니다. 그러면 업데이트가 됩니다.

아....다 됐네요. 아.....POST로 글쓰는 것을 빼먹고 안했는데요. 그냥 위처럼 XML로 넘겨주기만 하면 돼요 ^^
flex로 게시판 만드는 것도 해야하는데, 졸려서 내일로.....-_-;

내일은 선테크데이2008가야지-_-;

[JAVA] netbeans 초간단 게시판을 위한 RESTful WebService를 만들어봅시다-_-; (1)


[Flex/AIR] RESTful을 이용한 Web Service 게시판 클라이언트.

 
Posted by 머드초보
,
 
우선 저도 잘 모르는 상태에서 삽질을 한거라....잘못된 점 있으면 바로바로 태클을 걸어주세요~

우선 리스트데이터 가져오기.
resources/wsboards/ 형태로 요청을 하면 데이터를 가져옵니다.
WebService로 넘겨줘야할 값은 start값과 max값을 넘겨줘서 값을 가져옵니다. method는 GET입니다.

1개 게시물데이터 가져오기.
이것은 url로 resource/wsboards/{idx}/ 하면 해당 idx에 맞는 데이터를 가져옵니다. method는 GET입니다.

게시물 쓰기
resources/wsboards/로 xml형태의 글쓴이, 제목, 내용, 비밀번호 등의 정보를 보내줍니다. method는 POST입니다.

게시물수정
resources/wsboards/{idx}/{pwd}로 xml형태의 글쓴이, 제목, 내용, 비밀번호 등의 정보를 보내서 {pwd}랑 맞으면 수정합니다. method는 PUT입니다.

게시물삭제
resources/wsboards/{idx}/{pwd}로 요청해 pwd랑 서버에 있는 데이터pwd랑 비교해서 맞으면 삭제합니다. method는 DELETE입니다.

요렇게 5가지만 있으면 되겠군요.

저는 NetBeans6.1 + GlassFish V2 + MySQL 5.0에서 했습니다 ^^
우선 DB를 만듭시다. MySQL을 실행해서 해당 wsboard 테이블을 만듭니다.
[code]DROP TABLE IF EXISTS `mudchobo`.`wsboard`;
CREATE TABLE  `mudchobo`.`wsboard` (
  `idx` int(10) unsigned NOT NULL auto_increment,
  `writer` varchar(10) NOT NULL default 'writer',
  `pwd` varchar(10) NOT NULL default 'pwd',
  `subject` varchar(50) NOT NULL default 'subject',
  `content` text,
  PRIMARY KEY  (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8;
[/code]

1. 넷빈즈6.1을 실행합니다.

2. New Project -> Web -> Web Application -> Project Name은 BoardWS로.....
서버는 GlassFish V2로 합니다. (tomcat으로 해도 되는데, 테스트가 용이하지 않아요!). Finish!

3. 해당프로젝트에 New -> Entity Classs from Database -> Data Source 선택, New Data Source -> JNDI Name에는 jndi/board, Database Connection에는 New Database Connection선택, Name을 MySQL로 바꿔주고, 알맞게 셋팅합니다 ^^ 그리고 확인을 누르면 해당 database에 있는 모든 테이블을 가져옵니다. 이중에 우리가 만든 wsboard테이블을 선택하고 add합니다 ^^
pakage는 boarddb라고 합시다. 아래 Create Persistence Unit를 선택해서 걍 다 디폴트로 주고 Create합니다. (이건 Unit을 자동으로 생성해주는 것 같더군요. 즉, 사용자가 직접 만들 수도 있죠. 아직 저는 JPA를 모르니..ㅠ) Finish!

해당 객체가 만들어졌습니다. 소스를 보게 되면
[code]@Id
@Column(name = "idx", nullable = false)
private Integer idx;
@Column(name = "writer", nullable = false)
private String writer;
@Column(name = "pwd", nullable = false)
private String pwd;
@Column(name = "subject", nullable = false)
private String subject;
@Lob
@Column(name = "content")
private String content;
[/code]
속성값을 Column이랑 애노테이션을 이용해서 자동으로 매핑해주는군요. MySQL의 text타입은 Lob(Large Object랍니다)으로 되는군요^^
이제 이것을 이용한 웹서비스를 만들어봅시다.

4. 프로젝트에 New -> RESTful Web Services from Entity Classes선택. 방금 추가했던 Wsboard클래스가 있습니다. add하고, Package만 boarddb.service, boarddb.converter로 바꾸고 Finish.

service클래스는 잘 보면 PersistenceService랑 WsboardResource, WsboardsResource 3가지가 있네요. PersistenceService는 말그대로 Persistence단에서 하는 db관련된 내용이구요. entity를 가져오거나, 추가, 삭제, 수정 등을 할 수 있는 클래스입니다.
WsboardsResource는 @Path("/wsboards/")가 클래스 앞에 붙어있는데요. 아마 저 해당 URL로 접근하면 이 클래스가 대신하는 것 같습니다. 이 클래스 메소드에 @GET, @POST가 있는데, 저 url로 저 메소드를 접근하게 되면 해당 메소드를 실행하는 역할을 하게 됩니다. Wsboard도 위와 비슷합니다 ^^

5. 프로젝트메뉴에 Test RESTful Web Services를 선택하면 브라우저가 뜨고, 테스트를 할 수 있습니다.

사용자 삽입 이미지

글이 길어지네-_-; 해당 웹서비스 수정은 다음시간에.....-_-;

[JAVA] netbeans 초간단 게시판을 위한 RESTful WebService를 만들어봅시다-_-; (2)


[Flex/AIR] RESTful을 이용한 Web Service 게시판 클라이언트.


참고자료 http://www.netbeans.org/kb/60/websvc/rest-mysql.html
 
Posted by 머드초보
,
 
항상 신기한 것으로 다가오는....위자드웍스의 또 다른 서비스를 런칭했네요.

위자드팩토리 주소입니다.
http://www.wzdfactory.com/

예전에 다음에서 런칭한 위젯뱅크와 비슷한데요.
위젯뱅크와 비교를 해서 보면 틀린 점이 있다면 해당 위젯의 크기를 조절할 수 있습니다-_-; 게다가 이동도 할 수 있습니다. 또, 블로그의 달린 모습을 볼 수 있는데.....
블로그를 그 미리보기 바탕화면에 띄워줘서 해당 위젯을 거기다가 그냥 위치 시켜보는겁니다! 참 기발하군요^^

사용자 삽입 이미지

다음 검색기를 선택했는데....음...미리보기를 한 것 같지 않아요-_-; 진짜 미리보기를 했었으면 하는데 ^^

또 해당 위젯마다 태그를 가지고 있어서 특정 역할을 하는 것 끼리 검색을 할 수 있더군요. 관심위젯으로 등록할 수도 있고, 선택을 해서 설치를 하게 되면 코드를 보여주는데, 이건 전에도 말했듯이 매우 쉽게 블로그에 등록할 수 있게 플러그인을 만들었으면 하는 생각이 들었습니다. 하지만-_-; 이렇게 하게 되면 위자드팩토리 사이트가 무의미해질 것 같아서......

그냥 퍼가기만 하고 나의 위젯정보를 보니.....사용하고 있는 위젯에 추가가 되어있네요.

근데...이거 왜 추천블로그를 위젯으로 만들었는지 모르겠네요. 별로 안 쓸 것 같은데-_-;
그리고, 그냥 일반 카테고리에서도 추천블로그가 나오는데, 이거 안나오게 하는 게 더 나을 듯 하네요. 공부/퀴즈 카테고리를 선택했는데, 추천블로그도 몇 개 같이 나옵니다. 추천블로그는 추천블로그 카테고리에만 나와야할 듯한데, 버그인지 모르겠네요 ^^

그리고, 모바일과 연동이 된다고 하네요. 모바일 연동은 아직 안되나봐요. 찾아봐도 없네요 ^^

다음위젯뱅크에는 게임도 있는데, 여기에는 없네요^^ 미술작품 감상 위젯도 있던데-_-;
둘 다 아직 초기 단계인데 얼른 빨리 성장했으면 좋겠네요. 블로그에 달고 싶을 만한 좋은 위젯을 만들었으면 좋겠습니다 ^^ 11월에 오픈하는 위젯만들기(개발자다보니 개발에 관심이 가는군요^^)에 어떤 기능이 제공되는지 궁금하네요^^
 
Posted by 머드초보
,
 
우선 RESTFul로 구현된 WebService를 Flex에서 호출하기 위해서는 클라이언트에서 method방식이 GET, POST, DELETE, PUT을 지원을 해야합니다. 근데, 제가 RESTful WebService를 만들었는데요. 만들어놓고, 자체 GlassFish에서 제공하는 RESTful WebService Test로는 무쟈게 잘 돌아갔습니다.
근데, Flex에서 제공하는 HTTPService를 이용해서 method는 DELETE로 놓은다음에 http요청을 해봤습니다. 이게 왠걸......POST로 요청이 되는 듯해서 데이터를 가져오고 있습니다-_-; 지워야하는데!

그래서 검색을 해보니.......
http://verveguy.blogspot.com/2008/07/truth-about-flex-httpservice.html
저의 짧은 영어실력으로 보니.......
4/ All HTTP PUT and HTTP DELETE requests are turned into POST requests. This appears to be a browser limitation that the Flash player is stuck with.
라고 되어있군요. PUT과 DELETE는 POST로 요청이 된다고 하는 것 같습니다. 플래쉬플레이어가 브라우저 제한에 뭐 걸린 것으로 보인다고 말하는데요. 해석이 잘 안되네요-_-;

그래서! 검색해본 결과 REST요청을 위한 라이브러리를 누가 만들었더군요. 대단합니다 ^^ 어차피 HTTP요청도 해당 포트로 뭐 데이터를 주고 받는 것이다 보니, 이것을 소켓으로 구현을 했더군요.

http://lab.arc90.com/2008/03/restservice.php

기존 HTTPService랑 틀린 것이...얘는 소켓을 통해서 쏘기 때문에 포트를 지정해줘야합니다. 그리고 arc90에서 만든 ResultEvent랑 FaultEvent를 사용해야합니다.

서버측 코드를 보면
[code]
@DELETE
    public Response delete() {
        PersistenceService persistenceSvc = PersistenceService.getInstance();
        try {
            Wsboard entity = getEntity();
            if (entity.getPwd().equals(pwd))
            {
                persistenceSvc.beginTx();
                persistenceSvc.removeEntity(entity);
                persistenceSvc.commitTx();
               
                return Response.ok("success").build();
            }
        } finally {
            persistenceSvc.close();
        }
        return Response.ok("fail").build();
    }
[/code]
그냥 단순히 비밀번호가 같으면 지워서 응답을 success로 주고, 틀리면 fail로 줍니다.

이제 플렉스에서 봅시다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute"
    creationComplete="init()" xmlns:rest="com.arc90.rpc.rest.*">
   
    <mx:Script>
        <![CDATA[
            import com.arc90.rpc.events.FaultEvent;
            import com.arc90.rpc.events.ResultEvent;
            import mx.controls.Alert;
           
            private function init():void
            {       
                service.send();               
            }

            private function result(event:ResultEvent):void
            {
                Alert.show(event.result.toString());
            }   
           
            private function fault(event:FaultEvent):void
            {
                Alert.show(event.fault.toString());
            }       
        ]]>
    </mx:Script>
    <rest:RESTService id="service"
        port="9080" url="http://localhost/BoardWS/resources/wsboards/22/1"
        result="result(event)" fault="fault(event)" method="DELETE">
    </rest:RESTService>
   
</mx:WindowedApplication>
[/code]
포트를 port라고 해서 따로 지정해줍니다.
저 웹서비스가 {idx}/{pwd} 형식의 url을 요청합니다. DB에는 22번의 idx를 가지고 pwd가 1인 데이터가 있습니다. 저렇게 요청하면 지워집니다.

사용자 삽입 이미지
ps. 정말 적절하지 못한 웹서비스군-_-;
 
Posted by 머드초보
,
 
아...저번 회 때에는 박재성씨가 준비한 세미나를 들어서 그 때에는 스프링에 관한 것 보다 그냥 협업프로세스를 도울 만한 유용한 프로그램이나 작업 방법을 소개하는 자리였습니다. 그래서 스프링에 관해서는 많이 듣지 못했는데요.

오늘 세미나는 우선 2가지 세션을 못들은 것이 좀 아쉽구요. 그래도 백기선씨의 Spring AOP가 도움이 많이 되었구요. 박찬욱씨의 그 괴물같이 손이 보이지 않을 정도로 하는 라이브로 코딩하는 실력을 보면서 감탄사를 내뱉느라 제대로 못 듣기는 했지만, 꽤나 유용한 시간이였습니다. 그리고 스프링 보안인 Spring Security에 관한 설명도 들었는데....마침 이 시간이 졸려서-_- 잤습니다(발표자님께는 죄송하지만ㅠ)

우선 11시에 도착을 했는데, 20분부터 한다고 공지가 되어있더라구요.

1. 박찬욱님의 Refactoring JDBC Programming
우선 기존 JDBC를 접근하는 방식을 스프링 jdbc templete을 라이브로-_-; 만들어 보는 과정을 보게 되었습니다. 이건 뭐 감탄사밖에 안 나오는 군요. 이런 것을 한번도 보지 못한 저로썬 그냥 놀랄 따름입니다-_-; 보통 이클립스의 리펙토리 기능은 잘 쓰기 힘든데, 저걸 저렇게 활용하는 사람도 있구나 라는 생각이 드는군요 ^^
기존에 JDBC는 Try Catch Finally Try Catch의 반복으로 이루어져있죠. 그래서 그걸 템플릿으로 만들어서 중복코드에 대한 제거를 하고, 바뀌는 부분만 비교해서 잘 보여주셔서 이해가 매우 빨랐습니다. (하지만....휙휙~지나가는 화면들..OTL...)
사실 기존에 DB연동 부분은 그냥 항상 사용하기만 해서 내부 구조를 볼 겨를이 없었거든요. 실제 구현체를 보니 신기할 따름이군요. 그냥 queryForObject, queryForList, update, delete, insert 등의 메소드를 가져다가 쓰기만 했지, 어떻게 돌아가는지 몰랐는데, 이제 보니 확실히는 아니지만, 어느정도 알겠네요. 인터페이스를 활용하여 Strategy패턴을 이용해서 하는 것이더군요. 이제부터 디자인패턴을 공부해야겠다는 생각이 좀 드네요-_-; 사실 Head First Design Patterns책이 있는데...왠지 펼치기 싫습니다만, 이제 펼쳐야겠습니다 ㅠ
아....그리고, 저도 이클립스 단축키를 좀 외워야겠습니다-_-; 저도 이제부터 간지코딩을...-_-;

2. 박현준님의 Spring Security
헉.....순간 졸다가 기절했습니다-_-; Spring Security를 사용 안해봐서 인지 모르겠지만, 내용도 너무 어렵고ㅠ 졸리고 해서....ㅠ 자다가 일어나니 그 데모를 좀 보여줬는데, 대충 내용을 보니, 그....로그인 프로세스를 데모로 보여준 것 같습니다. 인증을 한 페이지를 보여주고 막 그랬던 것 같은데.....사실 잘 모르겠군요 ㅠ
얼마전 OAuth를 공부한 적이 있었는데, Spring Security에서도 지원을 한다고 한 것이 생각나는군요. 갑자기 얘기가 또 새네-_-; 암튼 보안쪽도 공부를 해봐야겠습니다 ㅠㅠ

3. 백기선님의 Spring AOP
우선 AOP에 대한 개념을 쉽게 설명해주어서 좋았구요. 하지만, 제 친구는 AOP에 대한 개념을 처음 접하는데, 용어가 너무 어렵다고 하더군요. 저도 친구들이랑 AOP스터디를 했을 때 advice, advisor, pointcut, joinpoint 등의 용어가 처음에는 헷깔렸는데, 그런 용어를 통해 친구가 그냥 처음에 들으려니까 어려운 부분이 있었나 봅니다. 암튼, AOP에 대한 EMAIL예제를 보여주시고, 1.X대 방식, 2.0.X방식, 2.5방식(어노테이션)을 보여주시고 ^^ 예전에 최범균님의 스프링2.5프로그래밍이라는 책에서 나온 예제가 있는데, 그것이 생각나더군요. 거기에서도 다 나와있었어요. 1.X대 방식은 어떤 인터페이스를 구현하는 것으로 나오고 ^^ 2.0.X는 POJO로 하고, XML설정파일에서 포인트컷을 정의를 해주는 방식이죠. 2.5의 어노테이션은 마법이죠 ^^
아...그리고 신기했던 것이 저도 @AspectJ 붙이면 컴포넌트 스캔이 안되는데, 그걸 포함시킬 수 있더군요.
저는 그냥
[code]<bean class="~~~~.AnnotMyAop" />[/code]그냥 선언해줬는데-_-; 컴포넌트 스캔에 AspectJ클래스를 넣으면 되는군요.
그리고, Spring AOP와 AspectJ를 비교하셨는데, 역시 AspectJ는 안써봐서 모르겠군요-_-;
또 하이버네이트는 제가 안해봐서 몰르겠는데, 이거 db를 객체랑 매핑해주는 거로 알고 있는데, add를 하면 insert를 하는건데, 이거 지가 필요하면 하는 거군요. 그래서 jdbctemplete이랑 같이 쓰면 데이터를 가져오면 insert가 안되서 문제가 발생하는데, 이걸 AOP로 해결할 수 있더군요. AOP를 예전에 회사에 적용해보려고 하다가 실패를 했던 기억이 있어서-_-; 다시 한번 해봐야겠습니다-_-;

근데, 이번 세미나를 마지막으로 무료세미나를 마친다고 한 것 같더라구요. 이제 돈내고 들어야하는건가....
암튼, 어느 정도 좋은 정보를 얻을 수 있었고, 도움이 많이 되었습니다. 스프링에 대해서 공부를 안한지 쫌 됐는데, 다시 한번 되새기게 만들어주네요. 우선 @MVC관련된 강의를 듣지 못해서 좀 아쉽구요. 저도 열심히 공부를 해야겠다는 생각이 드는군요.

이런 모임이 자주 있어서 좋은 정보를 공유했으면 하는데, 아직도 스프링 자료는 외국에서 많이 찾아야해요 ㅠ


 
Posted by 머드초보
,