반응형

 

https://extsdd.tistory.com/100

 

[Spring/eGov] #4 스프링 Sample 기본 예제 프로젝트, 패키지 이름 바꾸기 / 파일 찾기

 

extsdd.tistory.com

 

  저번 시간에 드디어 예제 프로젝트의 정체성을 완전히 내걸로 만들어놨다 ㅎㅎ이제 진짜 내프로젝트다. 이제 진짜 간단한 웹서비스를 만들어 볼껀데, 만드려는 서비스는 웹페이지를 포워딩 시켜주는 서비스 이다. 포워딩이란 다른곳으로 안내해준다는 건데, 사용자가 특정 URL로 접근하면 사용자가 가진 데이터를 확인해서 어디로 보내줘야할지 서버가 판단해주는 역할을 수행할 예정이다. 잔말 말고 컨트롤러를 추가해보자!!

 

1. Controller 추가

 

 

 

  일단 저번에 우리가 이 포워딩 기능을 담당하는 패키지가 fwd(fowarding)라고 정해놓았고 전 글들을 읽으면 알겠지만 컨트롤러 파일은 web에 위치해 있다. 따라서 1번에 있는 cpservice.fwd.web 디렉토리에 2번 New를 눌러 3번 Class를 생성해주자.

 

 

 

  별거 없다. 1번에 기능+Controller의 이름을 설정한다. 나는 forwading 기능을 수행하는 Controller이기 때문에 FwdController로 명명했다. 완료되면 딴거 손델 필요 없이 Finish를 눌러주자.

 

 

  ㅡㅡ... 찐따같은 파일이 하나 생겼다...음.. 지금까지 보던것고 다르게 간지가 하나도 안난다..기본적인 컨트롤러의 꼴을 잡아보자.

 

  먼저 이 FwdController 자바 파일은 컨트롤러의 역할을 수행할 것이기 때문에 서버가 서블릿한테 내가 컨트롤러라는 것을 알려야한다. 그러기 위해선 저번시간에 말했던 @ 모양의 어노테이션을 이용해 알린다고 했다. 한번 추가해보자

 

 

  망해따 벌써 오류가 뜬다.. 하지만 아니다. 저 빨간 줄이뜬 Controller라는 글자위에 마우스를 올려두고 한 1~2초를 기다려보자.

 

 

  이런 창이 나타난다. 그렇다 이클립스는 오류가 발생했을때 자기가 해결 할 수 있는만한것은 여려가지 방법으로 저렇게 추천을 해준다. 위 오류는 그거다. 그냥 @Controller만 써놓으면 컴퓨터가 모른다는 것이다. 그럼 저기 빨간 네모친 해결방안을 눌러보자.

 

 

  그럼 저 컨트롤러에 대한 정보들이 Import되는 것을 볼 수 있다. 그렇다. 컴퓨터가 알아먹을 수 있게 쟤에 대한 정보를 우리 컨트롤러에서 사용할 수 있도록 불러오자는 뜻이다. 저 org.springframework.stereotype.Controller 파일을 여기서도 사용하겠단 뜻이다. 그럼 저 @Controller가 뭔지 어떤놈이지 알아먹을 수 있단 소리로 이해하면 된다.

 

  저렇게 @Controller를 컨트롤러 클래스에 붙여놓음으로써 이제 서블릿은 사용자의 요청이 들어왔을때 여기서도 뒤지게 된다 ㅎㅎ 자. 이제 컨트롤러는 만들었고 이제 기능을 진짜로 만들어보자!!

 

  위에서 말했든 만들어볼 기능은 어떤 데이터를 사용자가 주면 그거에 따라서 서버가 알맞은 페이지를 띄어주는 기능이다. 자 그럼.. 일단 먼저 선행되어야 하는게. 사용자가 데이터를 줄때 이 데이터를 어떻게 넘겨주고, 서버에서 그걸 어떻게 받느냐는 것이다.

VO = Value Object (데이터 주머니)

 

  자 스프링에서 자료를 주고받고하는 대표적인 개념이다 브이오!! 한국말로 값을 가진 객체다!! 이게 머냐면은, 음.........구식 방식부터 생각해보자. 고객 검색 기능을 수행한다고 할때 최초에 사용자가 고객을 검색하면 이름, 연락처, 주소 등 3가지의 정보를 조회했다고 해보자. 과거에는 이 값들을 다 코드에 쳐서 달고 다녔다.

 

  통신기술이 발달함에 따라, 더 많은 정보들을 처리하게 되고, 예전시스템으로 어떤 기능을 처리하는데 200개의 변수를 담고 있다면.. 생각만해도 개 노가다일꺼 같다는 생각이 든다.. 그리고 이 고객정보 데이터를 한번만 가지고 가는것도 아니고 연계기능들을 수행하면서 계속 달고다니는데 그럴수록 문제는 더 심해진다.

 

  그래서 나온게 바로 VO다! 값들을 가진 객체!! 근데 이게 모든 데이터를 VO라는 데이터 주머니에 다 때려 박는게 아니고, 그 컨트롤러가 취급하는 정보들끼리 나눠놓는 것이다. 자 봐라, 고객정보를 처리하는 컨트롤러가 있고, 예약정보를 처리하는 컨트롤러가 있다고하면 여기서 VO는 몇개 일까? 2개다! (죽어도 2개여야하는 것은 아니다. 같이 쓸 수도 있고, 공통VO도 있고 하니까..)

 

 

  위 사진처럼 각 컨트롤러마다 필요한 공통정보들이 들어가 있을것이다. 저렇게 기능단위로 다 묶어놓으면 예약을 처리할때 저 VO만 가지고 댕기면 예약처리하는곳 어디서든 저 VO객체 하나만 넘기면 되는것이다. ㅎㅎ 쉽게 말하면 각 컨트롤러에서 사용하는 데이터들을 각각 모아놓은게 VO라고 보면 된다.

 

  나는 FwdController에서 취급할 데이터로는 고객이 요청할때 숫자 데이터를 넣어줄껀데 그데이터를 담고있는 VO를 지금 만들어보자.

 

 

  내가 FwdController에서 사용 할 VO다.... 기능이 너무 간단해서 사용자가 요청하는 데이터 한개만 담고 있을 VO다 .. 간지는 안나지만 따라하기엔 쉬울것이다. 이제 진짜 VO를 만들어보자.

 

 

  우리가 컨트롤러.java 파일을 생성했던 것 처럼 cpservice.fwd.service 패키지에 FwdVO.java를 추가해준다. 그리고 더블클릭하여 코드를보자!... 역시 간지가 안난다 빨리 채워보자.

package cpservice.fwd.service;

import java.io.Serializable;
import org.apache.commons.lang3.builder.ToStringBuilder;

public class FwdVO implements Serializable{


	/** reqParam */
	private int reqParam;

	public int getReqParam() {
		return reqParam;
	}

	public void setReqParam(int reqParam) {
		this.reqParam = reqParam;
	}


	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this);
	}
	
}

 

  해당 내용을 복붙해준다. 만약 프로젝트 이름이 다르다면 그것만 수정해주면 된다.

 

 

  소스를 복붙하고, 저기 FwdVO에 마우스를 올리면 Add generated serial version ID 버튼이 있자. 버튼을 눌러 UID를 할당시키자. serialVersionUID란 같은 클래스인지 판별할때 쓰이는데 나중에 프로그램이 변하거나 할때 프로젝트가 안깨질 확률이 높아진다. 눌러서 추가하자.

 

 

  자 UID를 추가해서 serialVersionUID가 생성된 것을 볼 수 있다. 근데 저건 사실 필요없고 이제 VO에 담길 실제 데이터를 보자. 나는 진짜 딱 한 변수만 VO에 담았다. 혹시 다른사람 더 추가하고 싶은게 있으면 1번꼴로 계속 밑에 써내려가면 된다. 2번 박스는 VO에 한번만 작성되면 되는거라서 신경이 크게 안쓰인다. 머냐면은 VO.toString() 함수를 돌리면 VO내부에 있는 key 와 Value들이 쭈르륵 나와주게 하는 함수이다. 보통 로그데이터를 뽑거나할때 많이 쓰인다.

 

  다시 1번 박스를 보면 VO의 한 데이터는 3가지 구성으로 되어 있다 먼저 자료 선언이 있다. 나는 private int reqParam으로 선언해놨고 그 밑에 get, set이 붙은 함수들이 있다. 이건 약속이다 VO는 데이터 주머니기 때문에 데이터를 set하고 다시 가져갈 수 있도록 get이 있어야한다. 한변수당 이 두개 함수는 무조건 와야하는 것이다. 만약 없으면 오류가 난다.

 

자 여기까지 했으면 ReqParam이라는 하나의 데이터를 가지고 있는 주머니인 FwdVO를 생성했다. 이제 데이터 주고받을 주머니도 만들어 놨으니 진짜!! 컨트롤러에서 기능을 구현해보자!

 

@Request Mapping

 

package cpservice.fwd.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import cpservice.fwd.service.FwdVO;

@Controller
public class FwdController {

	@RequestMapping(value = "/reqUrl.do")
	public String selectSampleList(@ModelAttribute("searchVO") FwdVO searchVO, ModelMap model) throws Exception {

		return "redirect:http://www.naver.com";
		
	}
	
}

  자 다시 FwdController.java로 돌아와서 위 코드를 넣어주자! 그리고 코드를 분석해보자.

 

 

  새로 생긴거 위주로 보면 1번은 뭐 이제 살짝 느꼇을꺼다..크게 뭐 중요한건 아니라는걸... 어차피 소스 추가하면 이클립스가 다 자동으로 추가하기도 해주고, 없으면 넣으라고 알려도 주니까. 암튼 저 임포트 파일들은 아래 소스코드를 돌리는데 필요한 객체들을 다 가져와 놓은 것이라고 볼 수 있다.

 

  2번 박스를 보면 핵심이다. @RequestMapping 어노테이션이 붙으면 이건 서버에서 Servlet이 받아들일 URL주소를 정의할 수 있다! 나는 reqUrl.do 라고 정의해놨는데 기존에는 localhost:8080/reqUrl.do 주소를 쳐도 서버는 저게 뭔지 알 수 없었지만 이걸 추가하는 순간 서버는 localhost:8080/reqUrl.do를 요청하면 아래 구문들을 수행하게 된다!! 이런식으로 서버에 요청들을 여기 등록해놓을 수 있는것이다. 물론 경로형태로도 등록할 수 있다. localhost:8080/tm/rs/rm/reqUrl.do 이런식으로 세분화 시킬수도 있다는 말이당 ㅎㅎ 요기다 자기가 원하는 URL을 정의하면 된다. 나는 URL을 요청하는 작업을 구현할 것이기 때문에 reqUrl.do 로 지었당.

 

  3번 박스를 보면 함수이름은 selectReqUrl이고 그뒤가 살짝 어려울 수 있을텐데 설명을 들으면 그나마 이해가 갈 것이다. 자 처음부터 @modelAttribute("searchVO" FwdVO searchVO, ModelMap model) 이 구분부터 보면 이 요청이 오면 FwdVO라는 데이터주머니에 담아서 searchVO라는 이름으로 이 함수 내부에서 사용할 것이다. 그리고 model이라는 것을 만들어놨다가. 로직을 처하면서 여기다가 사용자가 볼 화면으로 보내줄 데이터들을 모아놓을 것이다~ 이정도 의미로 해석하면 되고, throws Exception 구문은 만약 에러가 발생할시 작동하는 함수인데 보통 서버 Log에 해당 사항을 기록한다.

 

  마지막 4번 보면 함수 내부에 별다른 로직은 없고 바로 return이 되는데, 기능을 해석해보면 사용자가 localhost:8080/reqUrl.do 이 URL로 접속하면 다시 naver로 포워딩 시켜주는 기능을 수행하게 되는 것이다. ㅎㅎㅎ

 

테스트

 

  자 이제 잘 작동하는지 모두 저장하고 서버를 작동시키자! 여러번 해봤으니 이제 따로 설명은 Pass..!

localhost:8080/reqUrl.do를 인터넷창에 입력해보자!

 

 

  뚜둔..! 분명 localhost 머시기 주소를 치고 들어갔지만 네이버 화면이 떳다!! 내가 만든 서버가 작동한 순간이다 .. 감동 짝짝짝.. 일단 오늘 여기까지하고.. 너무 졸려서 자러가야겠다..

 

#스프링 #Spring #전자정부프레임워크 #웹서비스 #만들기 #컨트롤러 #VO #생성 #다른 #URL #포워딩 #Controller

 

반응형
  1. 익명 2021.01.04 14:57

    비밀댓글입니다

  2. 익명 2021.01.28 13:21

    비밀댓글입니다

+ Recent posts