나의 이야기

STS Project 시작

레드얼더 2016. 12. 22. 20:49

구구단이라는 새로운 패키지를 만들어 보자.
이것은 STS에서 우리가 처음으로 만들어 보는 것으로 패키지 이름은 com.zipimee.steve.gugudan이다.




다음은 STS 프로젝트의 개괄도(?)다.
우리가 만드는 구구단은 페이지, 컨트롤러, 서비스로만 구성되겠다.

Page와 Controller사이에 Spring Dispatcher Control이 있다고 하나 너무 복잡하여 그냥 넘어가기로 한다. .




필요한 폴더와 파일을 알아보자.
servlet-context.xml에 보면 우리가 정해놓은 base package가 com.zipimee.steve라 적혀있다.
이 아래에 gugudan을 만들 것이며 패키지 이름은 comp.zipimee.steve.gugudan이 되겠다.

comp.zipimee.steve.gugudan아래에 controller, dto, service를 service 아래에 impl이라는 패키지를 만들자. .




뒤집어진 삼각형 모양의 아이콘을 누르면 메뉴가 뜬다.
여기서 Package Presentation을 Hierarchical로 바꾸면 아래처럼 보기 편한 구조로 보여진다 .




src/main/webapp/은 base 또는 기준이다.
주소창에 localhost:8081/steve/는 여기(src/main/webapp/)를 말한다고 생각하면 맞다.

src/main/webapp/WEB-INF/views는 파일의 베이스다.
views 폴더 아래에 home.jsp가 있다는 사실을 주목하자.

이제 src/main/webapp/WEB-INF/views에 gugudan이라는 폴더를 만들자.
그리고 gugudan 아래 index.jsp와 run.jsp(혹은 result.jsp)를 만들어준다.

그렇게 되면...
실행시 [크롬 주소창에] localhost:8081/steve/gugudan/index를 넣고 엔터키를 눌러야 한다.
참고로 zinc 생성시 자동으로 만들어 진 패키지는 주소창에 localhost:8081/steve/home을 넣는다.
(실제로는 localhost:8081/steve다. 이유는 컨트롤러에서 URL로 slash 하나로만 지정 @RequestMapping(value="/"...)




패키지와 폴더 준비를 마쳤다.
이제 필요한 jsp와 java 파일을 생성할 차례다.




여기서 필요한 파일은 아래와 같다.

index.jsp - 입력 페이지 위치 - /views/gugudan/index.jsp
run.jsp - 츨력 페이지 위치 - /views/gugudan/run.jsp

GugudanController.java - 컨트롤러 위치 - comp.zipimee.steve.gugudan.controller
IGugudanService.java - 서비스 인터페이스 - comp.zipimee.steve.gugudan.service
GugudanServiceImpl.java - 서비스 - comp.zipimee.steve.gugudan.service.impl




index.jsp


다음 블로그에서는 <pre>나 <code> 가 먹히지 않는 것 같아서 캡춰를 떳다.
간단한 것들이니 home.jsp 내용을 복사해와서 약간의 수정만 하면 될 것이다.



run.jsp




GugudanController.java


# GugudanController.java # @Controller package com.xxx.gugudan.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import com.xxx.gugudan.service.IGugudanService; @Controller public class GugudanController { private static final Logger logger = LoggerFactory.getLogger(GugudanController.class); // dependency injection // bean에 메소드를 등록해지 않아도 자동으로 연결해 주라는 거임. // 두가지 방법으로 자동 연결... // 1. type으로 찾아냄. (IGugudanService로 구현한 구현체가 하나뿐일 때 // 2. 이름으로 찾아낸다. (우리가 쓸 방법. 단점은 이름을 바꿀 때 천개가 있으면 // 천개 모두 바꿔줘야 함. 그럴일이 별로 없지만..) // @Autowired는 자동으로 와이어링을 해주겠다는 것이다. // 메소드를 사용하기 위해 XML에 따로 빈을 작성해서 DI해주는 작업이 불필요 @Autowired private IGugudanService gugudanServiceImpl = null; // controller는 죄다 public @RequestMapping(value="/gugudan/index", method=RequestMethod.GET) public void index(){ logger.debug("=====> index에 들어왔습니다."); } // Model은 서비스로 정보를 보내기 위한 것 // @RequestParam("row") int row은 JSP에서 정보를 받아 오기 위한 변수 @RequestMapping(value = "/gugudan/result", method=RequestMethod.POST) // 반환타입이 void일 경우 run.jsp를 찾지만... String일 경우 return값을 찾을 것이다. // public void index() 참고 public String run(Model model, @RequestParam("dan") int dan, @RequestParam("row") int row){ logger.debug("=====> run 안에 들어왔습니다."); // 잘 받아오는 확인 logger.debug("dan ===> " + dan + " row ===> " + row); // 서비스로 dan과 row를 보내고 결과를 받 String str = gugudanServiceImpl.getResult(dan, row); // run.jsp으로 보내는 (post) 방법 model.addAttribute("dan", dan); model.addAttribute("row", row); model.addAttribute("sResult", str); // void면 페이지가 run.jsp // String으로 해서 return하면 그 이름의 페이지를 찾아감 // 앞에 /를 넣으면 안됨 - /gugudan/result는 안된다는 말... return "gugudan/result"; } }

위 소오스에서...
index.jsp와 GugudanController.java에서 URL을 /gugudan/result로 바꿔봤음.
이럴 경우 결과페이지 이름이 run.jsp과 아닌 result.jsp이어야 함.




IGugudanService.java


서비스 인터페이스다.

# IGugudanService.java # package com.xxx.gugudan.service; public interface IGugudanService { public String getResult(Integer dan, Integer row); }



GugudanServiceImpl.java


# GugudanServiceImpl.java # package com.xxx.gugudan.service.impl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import com.xxx.gugudan.service.IGugudanService; @Service public class GugudanServiceImpl implements IGugudanService { private static final Logger logger = LoggerFactory.getLogger(GugudanServiceImpl.class); @Override public String getResult(Integer dan, Integer row) { // TODO Auto-generated method stub StringBuffer sb = new StringBuffer(); for(int i=1;i<=row; i++){ sb.append(dan).append(" * ").append(i).append(" = ") .append(dan*i).append("<br>"); } return sb.toString(); } }



몇가지 팁


포털사이트 조소창을 자세히 보면 다음과 같이 쓰이는 것을 볼 수 있다.
www.daum.net/?name=홍길동&nick=슈퍼보이

이것이 GET이다.
오늘 올린 소오스에서도 GET과 POST가 있고 앞으로 많이 쓰일 건데, GET과 POST는 다음과 같은 차이가 있다.
get - 255kb로 제한되며 cache가 된다. 즉 기록이 남는다.
post - 사이즈는 무제한이며 기록이 남지 않는다.



단축키....
Ctrl + Shift + T - Open Type
Ctrl + Shift + R - Open Resource
둘 다 찾기 창이며 둘 다 GugudanController.java를 찾아준다.



아이콘...
이름은 Link with Editor이며 화살표가 좌우로 각각 하나씩 있는 모양새다.
Package Explorer 창에 달린 아이콘이다.
기능은 Editor창에 열린 파일을 Package Explorer창의 트리구조에서 해당 파일을 찾아준다.



GugudanController.java에서의 @Controller
컨트롤러에서 메소드 이름은 어떤 것을 쓰던지 상관없다.
그 위에 @Controller를 붙여주면 스프링이 이 메소드과 컨트롤러 구실을 하는 메소드라는 걸 안다.
참고로 @는 annotation이라하며 스프링에서 처음 사용된 것이 아니라 원래 Java에 있던 것이다.



결과 페이지에는 ${sResult}이 있을 것이다.
이것은 EL, 즉 expression Language다.
컨트롤로 (Java)에서 결과 페이지(HTML)로 데이터를 보내는데 쓰인다.



Eclipse에 에러가 생기면
[윈도우 경우] Owner (사용자) / m2 / repository를 날려버리면 된다.
그리고 나서 빨간색 느낌표가 뜨면 Alt + F5를 누른 다음 OK를 클릭해주면 된다.



GugudaController.java에서 URL이 길다고 생각되면...
@RequestMapping(value = "/gugudan/result", method=RequestMethod.POST)
import문 바로 아래에 다음을 정의해 주면...
@RequestMapping("/gugudan") // prefix
위 코드에서 URL를 아래처럼 짧게 적을 수 있다.
@RequestMapping(value = "/result", method=RequestMethod.POST)