AOP 관련 단어 정리


안녕하세요.
고코더 입니다.


이전 시간에는 AOP라는 의미에 대해 알아보았습니다. 이번 시간에는 사용하는 용어에 대해 알아보겠습니다. 



AOP 관련 용어


1. Aspect
기본적으로 AOP는 흩어진 Aspect들을 모아서 모듈화 하는 기법을 말합니다. 사전적으로 말하며 흩어진 관심사를 모듈화 한 것입니다. 부가기능을 모듈화 합니다.

2. Target
타겟은 Aspect할 대상을 말합니다. 핵심 기능을 담고 있는 모듈들은 부가기능을 부여할 대상이 됩니다.

3. Advice
실질적인 부가기능을 구현한 구현체를 말합니다. 어떤 동작을 해야할지 대한 것들입니다.

4. Joint Point
Advice가 적용될 위치에서 끼어들 수 있는 지점을 말합니다. 다양한 시점에 적용가능 합니다. (ex 메서드, 생성자 호출, 필드에서 값을 꺼낼때) 

5. PointCut 
JointPoint에서 상세한 스펙을 정의한 것 입니다. Advice가 실행될 지점을 구체적으로 정할 수 있습니다. 




advice 어노테이션


1. @Before 
 - advice 타겟에서 메소드가 호출되기 전 시점

2. @After
-  결과에 관계 없이 타겟 메소드 완료 후 시점

3. @AfterReturning 
- 타겟 메소드가 성공적으로 결과값을 반환 후 시점

4. @AfterThrowing 
- 타겟 메소드가 수행 중 예외 발생 후 시점

5. @Around  
- 어드바이스가 타겟 메소드를 감싸 타겟 메소드 호출 전후에 실행


마무리


하.. 어렵다


댓글을 달아 주세요


Plain old Java object 란?


안녕하세요.
고코더 입니다.


오늘인 POJO라는 개념을 알아봅니다. 개인적으로 몰라도 될거 같은 개념이지만 면접자들은 이걸 질문하기 좋아하므로 알아봅니다. 이 개념은 철학에 가깝습니다. 물런 구체화 하면 특정 방식의 소스가 POJO가 됩니다.



 1. POJO란 한줄로 표현하면?


"프레임워크에 종속된 무거운 객체를 만들게 된 것에 반발해서 사용되게 된 용어"


 2. 탄생 배경




마틴 파울러는 자바의 단순한 오브젝트를 이용하여 로직을 구현하는게 나은데 왜 EJB처럼 복잡하고 제한 많은 기술을 이용할까? 라는 의문이 들었습니다. 마틴은 그저 그럴싸한 이름이 없는게 원인 일까 싶어  POJO를 만들었습니다. 평범한 자바오브젝트에 멋진 이름을 붙여줬던 시도는 기대 이상으로 성공적이었다고 합니다.

우리는 사람들이 자기네 시스템에 보통의 객체를 사용하는 것을 왜 그렇게 반대하는지 궁금하였는데, 간단한 객체는 폼 나는 명칭이 없기 때문에 그랬던 것이라고 결론지었다. 그래서 적당한 이름을 하나 만들어 붙였더니, 아 글쎄, 다들 좋아하더라고. -마틴 파울러 -



 3. POJO의 정의


POJO는 Java 언어 규약에 의해 강제된 것 이외의 제한에 구속되지 않는 Java 오브젝트 이어야 합니다.

1.  지정된 클래스를 extends 하면 안된다.

2. 정의된 인터페이스를 implement 하면 안된다.

3. 정의된 Annotation을 포함하지 않는다



 4. POJO 기반 코드란?


1. 객체지형적으로 설계 되었는가?

재활용 가능하고 반복적인 템플릿이 없는 특징이 있습니다. 객체지향적으로 자바를 개발되어 있는지 확인해야 합니다

2. 테스트가 용이한가?

POJO 철학을 이용해 만들어진 어플리케이션은 자동화된 테스트 코드 작성이 편리해야 합니다. 자동화된 테스트 코드를 개발 해야합니다.


마무리


사실 외우긴 했는데 쓰면서도 잘 모르겠네요.


댓글을 달아 주세요


관점으로 본 AOP


안녕하세요.
고코더 입니다.


OOP는 훌륭한 객체 프로그래밍입니다. 하지만 공통적으로 트랜잭션처럼 반복되는 중복코드가 생기는 단점이 있습니다. 중복코드를 좀 더 줄이고자 하여 탄생한게 AOP 입니다. 
Aspect Oriented Programming 의 약자입니다. 직역하자면 "관점 지향 프로그래밍" 이라고 할 수 있습니다. 오늘은 AOP가 어떤 관점이 있는지 알아봅니다.


 1. AOP를 한줄로 정리하면?


"애플리케이션 전체에 걸쳐 사용되는 기능을 재사용 하도록 지원하는 개념"



 2. 비유


병원에 환자가 입원합니다. 맹장 수술이 필요하다고 합니다. 전날에 약을 먹고 금식을 지도하는걸 간호사가 합니다. 그리고 당일날 수술실에 환자를 눕히고 조명을 밝히고 수술 부위 소독과 매스까지 준비합니다. 그럼 의사가 들어와서 바로 수술에 들어갑니다. 
여기서 AOP는 간호사의 역할을 합니다. 어떤 수술이든 해당 과정은 동일합니다. 수술 외에 부가적으로 보면 전날 금식을 지도하고 수술을 준비하는건 매번 동일합니다. AOP는 이런 공통적 요소를 추출하여 재사용하는 기법입니다.
(더 좋은 비유 있으면 댓글을..)



 3. 부가기능 관점으로 바라보는 것


1. OOP (핵심기능 관점)

기존의 OOP는 서비스를 바라보는 시점은 핵심기능으로 바라보았습니다. 글쓰기와 통계확인이라는 서비스를 개발하고 기능별로 조립하도록 하였습니다. 자바는 다중 상속을 지원하지 않아서 핵심기능으로 바라보는 측면도 있습니다.




2. AOP (부가기능 관점)

AOP는 부가기능의 관점으로 이를 바라봅니다. 그리고 이런 공통적인 요소를 추출하는 것이고 이를 관점 지향 프로그래밍이라고 말합니다. 

- 공통 기능이 하나의 장소에서 관리
- 이 외에 모듈을 신경쓰지 않고 개발만 충실하게 하도록 한다



마무리


AOP는 계속 시리즈로 알아보겠습니다. 



댓글을 달아 주세요


DTO 생성 


안녕하세요.
고코더 입니다.


이번에는 DTO 라는 객체에 대해서 알아봅니다. DTO(Data Transfer Object)는 VO(Value Object)라고 합니다.
계층간 데이터 교환을 위한 자바빈즈이고 컨트롤러, 뷰 계층간 데이터 교환을 위한 객체입니다.
DTO는 로직을 없고 순수한 데이터 객체만 다룹니다. getter, setter 메소드를 생성한 클래스입니다.

다시 쉽게 말하면 DAO 데이터베이스를 가져올때 사용하는 변수의 집합이라고 생각하면 쉽습니다.



 1. dto 클래스를 생성 합니다.


컨트롤러를 생성하겠습니다. 
net.gocoder.mvcboard.dto 패키지에서 class를 생성 합니다. 


클래스명은 Dto로 생성 합니다. 


package net.gocoder.mvcboard.dto;
import java.security.Timestamp;
public class Dto {
     int Idx;
     String Name;
     String Title;
     String Content;
     Timestamp Regdate;
     Timestamp Modidate;
     int Passwd;
     int Hit;
}

7~14번 라인
    - 데이터베이스에 사용할 변수들을 선언하고 해당 변수에 대해 setter, getter을 생성 합니다. 
       - 생성 방법은 책 앞면에 나와 있습니다. 


그리고 생성자를 통해 사용할 수 있도록 메소드를 하나 만들어 보겠습니다.
     public Dto() {
                     
     }
     
     public Dto(int Idx, String Name, String Title, String  Content,
                Timestamp Regdate, Timestamp Modidate, int  Passwd, int Hit ) {
           this.Idx = Idx;
           this.Name = Name;
           this.Title = Title;
           this.Content = Content;
           this.Regdate = Regdate;
           this.Modidate = Modidate;
           this.Passwd = Passwd;
           this.Hit = Hit;      
     }          

setter에 값을 넣어서 사용할 수 있게 this를 이용하여 변수를 담습니다.

이렇게해서 게시판에 사용할 Dto가 준비되었습니다.
한번 선언한 변수는 어느 곳에서나 재사용할 수 있게 됩니다.


마무리


Dto가 이해가 안되도 다음 시간에 Dao를 보면 이해가 됩니다.


댓글을 달아 주세요


MVC 컨트롤러(Controller) 개발


안녕하세요.
고코더 입니다.


이번 시간에는 스프링에 핵심인
컨트롤러를 만들어 보겠습니다.

이전에 설명한 거처럼 디스패처 서블릿이 컨트롤러를 호출하면 컨트롤러는 
Dao를 호출해 데이터베이스 정보를 가져오고 다시 
모델에 담아 프론트에 전달 합니다.



 1. 컨트롤러 생성


컨트롤러를 생성하겠습니다. 
net.gocoder.mvcboard.controller 패키지에서 class를 생성 합니다. 


클래스 명은 BoardController 입니다. 
게시판에 사용할 컨트롤러명 입니다. 




 2. 컨트롤러 코딩 


컨트롤러 작성을 해보겠습니다. 하나의 메소드를 작성하면 거의 비슷한 형태에
나머지도 거의 비슷한 코딩을 이어나갑니다. MVC패턴에 매력이자 어려운 규율 때문입니다.
그래도 똑같다고 방심하지 말고 복습한다는 생각으로 읽어 가보세요.

리스트 페이지 컨트롤러를 작성 해보겠습니다.
@Controller
public class BoardController {
     Command command;
     
     @RequestMapping("/list")
     public String list(Model model) {
           System.out.println("list()");
           command = new ListCommand();
           command.execute(model);
           
           return "list";
     }

17번 라인 
    - 해당 클래스를 컨트롤러 사용하기 위해 어노테이션 @Controller을 사용합니다.
    - "import org.springframework.stereotype.Controller;" 를 참조해야 합니다.
19번 라인
    - 커맨드 인터페이스를 사용하기 위해 command로 호출 합니다. 
21번 라인 
    - "/list" 접근시 해당 컨트롤러가 호출 됩니다.
23번 라인 
    - List커맨드를 가져와서 객체를 만듭니다.
    - 해당 객체에 모델을 실행합니다. 
    - 현재까지는 커맨드안에 내용들은 개발되어 있지 않습니다.
26번 라인
    - view로 모델을 전달 합니다.


글 등록 페이지 컨트롤러를 작성 해보겠습니다.
     @RequestMapping("/write")
     public String write(HttpServletRequest request, Model  model) {                   
           model.addAttribute("request", request);
           command = new WriteCommand();
           command.execute(model);
           
           return "redirect:list";
     }

29번 라인 
    - "/write" 접근시 해당 컨트롤러가 호출 됩니다.
31번 라인
    - request에 담긴 파라미터 값을 데이터객체를 모델에 담습니다.
32~33번 라인
    - 커맨드 객체를 이용해 모델을 실행합니다.
35번 라인
    -"redirect:" 페이지를 이동 시킵니다.
    -글 등록 후에 list로 페이지를 이동합니다.


글 상세 컨트롤러를 작성합니다.
     @RequestMapping(value="/modify", method=RequestMethod.POST  )
     public String modify(HttpServletRequest request, Model  model){                    
           model.addAttribute("request", request);
           command = new ModifyCommand();
           command.execute(model);
           
           return "redirect:list";
     }

38번 라인
    - "/write" 접근시 해당 컨트롤러가 호출 됩니다.
40번 라인 
    - request에 담긴 파라미터 값을 데이터객체를 모델에 담습니다.
41~42번 라인 
    - 커맨드 객체를 이용해 모델을 실행합니다.
44번 라인
    - view로 모델을 전달 합니다.


글 수정 컨트롤러를 작성합니다.
     @RequestMapping(value="/modify")
     public String modify(HttpServletRequest request, Model  model){                    
           model.addAttribute("request", request);
           command = new ModifyCommand();
           command.execute(model);
           
           return "redirect:list";
     }

47번 라인
    - "/write" 접근시 해당 컨트롤러가 호출 됩니다.
49번 라인
    - request에 담긴 파라미터 값을 데이터객체를 모델에 담습니다.
50~51번 라인
    - 커맨드 객체를 이용해 모델을 실행합니다.
53번 라인
    -"redirect:" 페이지를 이동 시킵니다.
    -글 수정 후 list로 페이지를 이동합니다.

글 삭제 컨트롤러를 작성합니다.
     @RequestMapping("/delete")
     public String delete(HttpServletRequest request, Model  model) {        
           model.addAttribute("request", request);
           command = new DeleteCommand();
           command.execute(model);
           
           return "redirect:list";
     }

56번 라인
    - "/write" 접근시 해당 컨트롤러가 호출 됩니다.
58번 라인
    - request에 담긴 파라미터 값을 데이터객체를 모델에 담습니다.
59~60번 라인
    - 커맨드 객체를 이용해 모델을 실행합니다.
62번 라인
    -"redirect:" 페이지를 이동 시킵니다.
    -글 삭제 후 list로 페이지를 이동합니다.


이렇게 게시판에 필요한 모든 클래스를 만들었습니다.
처음이 어렵지만 한번 따라하다보면 컨트롤러 개발 방법이 속에 익어 갈것입니다. 



마무리


쉽지 않나요?


댓글을 달아 주세요


커맨드 생성하기 


안녕하세요.
고코더 입니다.

오늘은 서비스 객체인 command를 만들어보겠습니다.
커맨드 객체는 컨트롤러와 데이터베이스를 연결해주는 역할을 합니다. 
기본적으로 커맨드 객체는 기본 인터페이스를 통해 작동합니다.

오늘 할 작업 할 내용을 구조도로 그려보았습니다. 
커맨드는 인터페이스를 만들어서 이를 사용해
contet(상세), delete(삭제), list(목록),modify(수정)을 만들어보겠습니다.






 1. 커맨드(command) 인터페이스 생성 


마우스 오른쪽 버튼을 눌러서 new -> interface를 생성 합니다. 


인터페이스 이름은 "Command"로 생성합니다.
모든 커맨드에 기본 인터페이스로 참조될 것입니다.


그리고 안에 내용을 아래처럼 채워넣습니다. 
이 커맨드는 각 서비스 커맨드에 인터페이스로 사용 됩니다. 
import org.springframework.ui.Model;
public interface Command {
      public void execute(Model model);
}

7번 라인
    - 공통 실행을 위한 model을 선언합니다.



 2. ContentCommand - 상세보기 커맨드 생성


이번에는 게시판에서 상세보기 게시판 뷰에 해당하는 커맨드를 만들어 보겠습니다. 
해당 커맨드 패키지에서 
new -> class를 생성 합니다. 


그리고 interfaces에서 add를 클릭 합니다.
Name에는 ContentCommand


그리고 command를 검색해서 아까 만들어놓은
인터페이스를 참조하도록 설정 합니다. 


그리고 해당 command 객체에는 아래처럼 내용을 담습니다.
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
public class ContentCommand implements Command {
      @Override
      public void execute(Model model) {
            // TODO Auto-generated method stub
            Map<String, Object> map = model.asMap();
            HttpServletRequest request = (HttpServletRequest)  map.get("request");
            String Id = request.getParameter("Id");
      }
}

7번라인 
    - 인터페이스 Command를 Implements를 합니다. 참조합니다. 

12번 라인
    - Model에 담아온 값을 map 타입에 담습니다.
    - requetst 값을 사용하기 위해 선언합니다.
    - 그리고 컨텐츠 상세보기를 위해서 Id 값을 가져옵니다.



 3. DeleteCommand 


삭제를 담당할 커맨드 객체를 생성합니다. 생성 과정은 동일하며 코드도 같습니다.


id 값을 받아 삭제를 요청할 것입니다. 


 4. ListCommand


게시판 목록을 노출할 리스트 커맨드를 생성 합니다.


dao객체가 아직 없기에 빈 커맨드 상태로 둡니다.
package net.gocoder.mvcboard.command;
import org.springframework.ui.Model;
public class ListCommand implements Command {
     @Override
     public void execute(Model model) {
           // TODO Auto-generated method stub
     }
}




 5. WriteCommand


글쓰기 커맨드를 생성 합니다.


내용은 아래처럼 채워 넣습니다. 작성자,제목,내용을 받아 입력할 것입니다.
package net.gocoder.mvcboard.command;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
public class WriteCommand implements Command {
     @Override
     public void execute(Model model) {
           // TODO Auto-generated method stub
           
           Map<String, Object> map = model.asMap();
           HttpServletRequest request = (HttpServletRequest)  map.get("request");
           String Name = request.getParameter("Name");
           String Title = request.getParameter("Title");
           String Content = request.getParameter("Content");
     }
}

15~17번 라인
    - 글쓰기 내용을 가져옵니다.


 6. ModifyCommand 


수정 커맨드를 생성 합니다. 동일한 과정입니다. 


수정 커맨드는 글쓰기 커맨드에 id값을 하나 더 받아 옵니다.
package net.gocoder.mvcboard.command;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
public class ModifyCommand implements Command {
     @Override
     public void execute(Model model) {
           // TODO Auto-generated method stub
           Map<String, Object> map = model.asMap();
           HttpServletRequest request = (HttpServletRequest)  map.get("request");
           String Id = request.getParameter("Id");
           String Name = request.getParameter("Name");
           String Title = request.getParameter("Title");
           String Content = request.getParameter("Content");
           
     }
}

15번 라인 
    - id 값은 조건절에 사용됩니다.
16~18번 라인
    - 수정될 정보를 받아 처리 합니다.



 7. Command 조직


해당 커맨드가 생성된 모습입니다. 게시판에 필요한 기능을 우선 만들었습니다. 
나중에 커맨드는 dao를 추가하는등에 수정을 이루어질 것입니다.



마무리


각 객체에 대한 이해도를 높히기 위해 커맨드를 일괄 생성하였습니다.



댓글을 달아 주세요


게시판 만들기 초기설정


안녕하세요.
고코더 입니다. 


스프링에 대해 알아보았고
간단한 예제로 중요한 요소들을 살펴보았습니다.
이번 시간부터 스프링 게시판을 만드는 방법을 알아보겠습니다.
기본적으로 회사에서 많이 사용하는 방식으로 구현할 것 입니다.



 1. 프로젝트 구조도




함께 만들어올 게시판에 구조도 입니다.
스프링으로 웹프로젝트를 하면 대부분 이런 구조가 나타나는데요.
이 그림은 머리속에 한번 새겨 보시고 프로젝트를 함꼐 하면서
조금씩 구체화 되어 나갈것입니다.



 2. 프로젝트 생성 


 2-1. 이번 프로젝트 이름은 MVCBoard 라고 하겠습니다.
이전 시간에 배웠던 방법대로 MVC Project를 만들어보겠습니다.


 2-2. 이번 패키지 명은 net.gocoder.mvcboard로 만들어 보겠습니다. 


 2-3. 그럼 이제 게시판을 만들 MVCBoard가 생성 됩니다. 





 3. 패키지생성


개발에 들어가기 전에 패키지를 생성합니다. 
패키지는 쉽게 말하면 폴더 입니다. 먼저 폴더를 만들어 구조도대로
개발을 준비하는 과정입니다. 

 3-1. package를 생성 하는 방법은 프로젝트에서 
new->package를 선택합니다.


 3-2. 그리고 아래처럼 입력하여 패키지를 만들겠습니다.
net.gocoder.mvcboard.command


 3-3. 그럼 이렇게 빈 패키지가 생성 됩니다. 


 3-4. 이런 방식으로 3가지 패키지를 더 생성 합니다.
net.gocoder.mvcboard.controller

net.gocoder.mvcboard.dao

net.gocoder.mvcboard.dto


 3-5. 만들어진 패키지 모습은 이런 구조가 됩니다.
빈 폴더이기에 하얀색이고 안에 파일은 아직 없습니다.



마무리


프로젝트를 생성하여 패키지를 만들었습니다.


댓글을 달아 주세요


데이터 객체로 변수를 줄이기


안녕하세요.
고코더 입니다. 


이전 시간에 파라미터 데이터를 VIEW로 전달을 해봤습니다.
기초적인 예제였는데요.


하지만 실무에서는 소스 길이기 갈게 나오지 않게 스프링에 장점을 살려서 변수를 클래스에서 가져오는 방법을 씁니다.
스프링은 커맨드 객체를 사용할 수 있도록 규칙이 설정되어 있으며 변수만 담아주면 이전 시간에 했던 소스를 간단하게 개발해 view에 전달할 수 있습니다.
소스를 함께 개발하면서 이 부분을 살펴보겠습니다
역시 이전 소스를 활용합니다.


 1. Gocoder.java 작성


 1-1. 클래스 파일을 생성합니다. 처음 생성하는 분들이 있으실텐데요
해당 프로젝트 팩키지로 마우스 오른쪽 버튼을 눌러 
new -> Class를 클릭 합니다. 

 
 1-2. Gocoder라는 이름으로 생성하였습니다.


 1-3. 그리고 아래처럼 변수를 세팅했습니다.
private만 작성하고 세터,게터를 작성하면 됩니다.
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
package net.gocoder.hello;
public class Gocoder {
     private String name;
     private String blog;
     private String homepage;
     
     public String getName() {
           return name;
     }
     public void setName(String name) {
           this.name = name;
     }
     public String getBlog() {
           return blog;
     }
     public void setBlog(String blog) {
           this.blog = blog;
     }
     public String getHomepage() {
           return homepage;
     }
     public void setHomepage(String homepage) {
           this.homepage = homepage;
     }
}
cs




 2. HomeController.java 수정


 2-1. 그 다음 HomeController.java를 수정합니다. 
기존에 만들었던 방식은 모두 주석 처리 합니다. 
그리고 아래처럼 새롭게 코딩을 합니다. 
1
2
3
4
5
@RequestMapping(value = "/gocoder/view", method =  RequestMethod.GET)
public String gocoderView(Gocoder gocoder) {
 
return "gocoder/view";
}    
cs

 2-2. 소스설명
기존에 저랑 함께 만들었던 소스를 주석처리 하지 않으면 오류가 납니다.
그리고 이게 전부입니다. 스프링이 생략이 많아 이해가 안되실지 모르겠지만
그냥 이렇게 하면 자동으로 맵핑 되는구나라고 생각하시면 됩니다.

55번 라인 
    - 동일하게 URL을 지정합니다
56번 라인
    - Gocoder 라는 클래스명을 gocoder로 생성합니다.
58번 라인
    - 뷰에 전달합니다.


 3. view.jsp HTML 추가


 3-1. 데이터 객체를 사용하면 el 태그에서 변수를 가져올때 배열 방식으로 가져와야 합니다.
gocoder라는 객체에 배열로 담겨 있고
배열 주소로 접근해야 합니다.
1
2
3
4
5
6
7
<h1>이름</h1>
<p>${gocoder.name}</p>
<h1>블로그</h1>
<p>${gocoder.blog}</p>
<h1>홈페이지</h1>
<p>${gocoder.homepage}</p>
 
cs

 3-2. 소스설명

25,27,29 라인
    - 대이터 객체 gocoder 안에 담긴 내용을 하나씩 가져 옵니다.



 4. 결과화면


 4-1. 2번 커맨드 객체 방식을 가져옵니다.


 4-2. 소스에 양을 비교해보세요.
오른쪽 버전도 충분히 서블릿 jsp에 비해 소스양은 줄었지만
데이터 객체를 사용한 버전은 정말 단순해졌습니다.



마무리


스프링에 묘미 입니다.





댓글을 달아 주세요


파라미터로 받아 view 노출하는 예제


안녕하세요.
고코더 입니다.


 1. 오늘은 HttpServletRequest 에 대해 알아보려고 합니다.
URL로 접근하는 모든 패턴은 디스패처서블릿이 가로챈다고 말씀드렸습니다.

 2. 이걸 기초로 오늘은 파라미터에 있는 정보를 HttpServletRequest로 데이터 전송을 받아보는 방법을 알아보겠습니다.
이전에 만든 hello 소스에 추가하여 개발해보겠습니다.


 3-1. 컨트롤러에 함수 추가 / HttpServletRequest / @RequestMapping


 3-2. HomeController.java를 수정 합니다. 


 3-3. 그리고 아래 코드를 입력 합니다
1
2
3
4
5
6
7
8
9
10
11
12
13
@RequestMapping(value = "/gocoder/view", method = RequestMethod.GET)
public String gocoderView(HttpServletRequest httpServletRequest, Model model) {
    
    String name = httpServletRequest.getParameter("name");
    String blog = httpServletRequest.getParameter("blog");
    String homepage = httpServletRequest.getParameter("homepage");
    
    model.addAttribute("name",name);
    model.addAttribute("blog",blog);
    model.addAttribute("homepage",homepage);
            
    return "gocoder/view";
}    
cs

 3-4. HomeController.java 추가된 소스 설명

41번 라인 
    - @RequestMapping는 해당 컨트롤러에서 해당 URL 패턴을 가로채는 어노테이션입니다. 
    - URL 패턴 /gocoder/view로 들어오는 접속을 캐치 합니다. 그리고 get인걸 확인합니다.     

42번 라인
    - gocoderView라는 함수를 만들고 HttpServletRequest를 선언합니다. 해당 클래스로 파라미터를 받을 수 있습니다. 
    - model 함수는 view에 데이터를 전달하기 위해 꼭 필요한 존재입니다.

44번~46번 라인
    - 42번 라인에서 선언한 httpServletRequest 클래스에 getParameter 를 이용해 파라미터 값을 가져옵니다.
    - 각 파라미터로 오는 값을 받습니다. 파라미터명과 변수명을 똑같이합니다. 헷갈리지 않기 위해 

48번~50번 라인
    - 프론트에 model을 통해 해당변수로 값을 담아 넘깁니다.
    - 이때도 역시 동일한 변수명으로 el태그를 프론트에 사용할때 헷갈리지 않게 사용 합니다. 

52번라인    
    - view에 전달할 주소를 적습니다. 
    - 마지막 파일명을 제외한 슬러시는 폴더가 됩니다. 즉 여기서 폴더는 gocoder 폴더 입니다.


 4. view파일 생성 / el태그


 4-1. 해당 폴더 위치에 view.jsp를 생성 합니다.
/hello/src/main/webapp/WEB-INF/views/gocoder/view.jsp


 4-2. 아래처럼 HTML을 코딩 합니다. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8" language="java" %>
<%@ page session="false"%>
<html>
<head>
<title>Home</title>
<meta http-equiv="Content-Type" content="text/html;  charset=utf-8" />
</head>
<body>
     <h1>이름</h1>
     <p>${name}</p>
     <h1>블로그</h1>
     <p>${blog}</p>
     <h1>홈페이지</h1>
     <p>${homepage}</p>
</body>
</html>
cs

 4-3. 소스설명

2번 라인 
    - JSP 상에 이미 입력된 한글 텍스트가 깨지지 않도록 엔코딩 태그를 넣어줍니다.
    ->

11,13,15번 라인
    - el태그를 사용해 모델에서 보내온 변수를 사용하여 프론트에 노출 합니다. 


 5. 결과화면 


 5-1. 정상적으로 코딩하셨다면 해당 링크로 접속시에 정상적인 뷰화면이 보입니다. 

 5-2. 가장 간단한 방식으로 파라미터를 받아 뷰에 노출하는 방식을 사용하였습니다.



마무리


여기까지 이해가셨다면 
스프링이 재밌어집니다.


댓글을 달아 주세요


스프링에서 UTF-8 한글 나오도록 설정


안녕하세요.
고코더 입니다.


 1. 스프링으로 기본 프로젝트를 생성하면 한글이 ?로 출력 됩니다.
스프링 기본 프로젝트는 UTF-8로 만들어지지 않기 때문입니다.


 2. web.xml에 아래 코드를 추가해주세요.
엔코딩필터에 UTF-8을 사용할 수 있게 만들어주는 코드 입니다.
     <filter>
           <filter-name>encodingFilter</filter-name>
          <filter-class>org.springframework.web.filter.CharacterEncodingFilter
           </filter-class>
           <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
           </init-param>
           <init-param>
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>
           </init-param>
     </filter>
     <filter-mapping>
           <filter-name>encodingFilter</filter-name>
           <url-pattern>/*</url-pattern>
     </filter-mapping>


 3. 위치는 맨아래에 추가합니다.  코드를 그대로 복사해서 붙혀넣어주세요.
xml이 변경되었기 때문에 서버를 재시작 합니다.


그리고 다시 접속해보면
물음표(?)로 보이던 한글이 정상적으로 출력 가능합니다.


마무리


영어권 국가였으면


댓글을 달아 주세요