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 철학을 이용해 만들어진 어플리케이션은 자동화된 테스트 코드 작성이 편리해야 합니다. 자동화된 테스트 코드를 개발 해야합니다.


마무리


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


댓글을 달아 주세요


Dependency Injection , Inversion of Control 를 알아보자


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



오늘은 의존성 주입(Dependency Injection)을 다뤄봅니다. 스프링의 핵심 개념중에 하나 입니다. 스프링에서 가장 중요한 핵심입니다. 이 부분때메 자바 서블릿을 하다. 스프링을 만나면 헤매게 되는 이유입니다. 100프로 이해하려면 현업에서 장점을 마주칠때 이해가 조금씩 되나 머리속에 잘들어오지 않는 개념입니다. 그러므로 그냥 얘는 원래 이러구나라고 생각하면 될거 같습니다.



 1. DI를 한줄로 요약하면


"객체간의 의존성을 외부에서 주입하는 개념"


 2. 비유



최근에 생긴 오락실을 가니깐 동전 넣는 부분이 없습니다. 그래서 물어보니 목에 매는 카드를 하나 줍니다. 이걸 가지고 게임을 원하는 만큼하고 계산대에서 카드로 계산하면 되는 방식이었습니다. 덕분에 동전 흘리고 다니지 않으면서 게임을 할 수 있었습니다. 여기서 나온 목에 매는 결제를 대신하게 하는 카드는 주입된 객체입니다. 철권이 한판에 500원이었습니다. 그런데 마진이 안남아 주인은 한판에 1000원을 올립니다. 기존 오락실이라면 각 오락기마다 가서 옵션을 수정해줘야 하지만 이 오락실은 사무실 컴퓨터에서 옵션을 변경하면 카드를 찍을때 1,000원 으로 찍히게 하면 됩니다.  그리고 19세 이상만 할 수 있는 게임이라면 게임카드에 조건을 걸어서 특정 카드는 성인게임을 못하게 막을 수도 있습니다. 외부에서 모든 게임 설정을 주입합니다.


외부에서 오락기에 가격을 통제하는 이 방식이 의존성 주입입니다. 


 3. DI 아주 단순한 예제


가장 단순하고 직감적으로 소스를 보여드리겠습니다.

1. beans.xml 
해당 XML 파일에 의존성을 주입합니다. Gocoder라는 클래스를 GC라고 id를 부여합니다. 그러면 해당 주입된 객체는 이제 사용이 가능합니다.

1
<bean id="GC" class="bean.GoCoder" />
cs

2. hi.java
gc라고 명명한 객체를 생성하여 소스에서 사용합니다. 이렇게 XML이라는 외부에서 주입하는것이 바로 의존성 주입입니다.

1
2
3
jGC gc;
    public HI (Printer printer){
}
cs


 4. IoC 제어의 역전


스프링하면 가장 먼저 떠올라야 하는 단어가 IoC입니다. 번역하면 제어의 역전이라는 뜻입니다. 기존의 제어권은 개발자가 결정하였지만 이를 역전하여 스프링에서 하겠다는 말입니다. 프레임워크 내부에서 결정된 사항대로 개발이 흘러가는걸 제어의 역전이라고 합니다. 

객체의 생성애서 생명주기의 관리 객체에 대한 모든 제어권이 바뀌었다는 뜻입니다.

개발자가 라이브러리를 불러와서 직접 개발했던 행위에서 프레임워크 내에 라이브러리가 구성되고 개발자는 프레임워크에서 작성된 방식대로 코드를 호출하기 때문에 주도권이 스프링에게 있게 됩니다.


마무리


어렵죠? 저도 맨날 까먹어요


댓글을 달아 주세요


관점으로 본 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로 페이지를 이동합니다.


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



마무리


쉽지 않나요?


댓글을 달아 주세요


게시판 만들기 초기설정


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


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



 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이 변경되었기 때문에 서버를 재시작 합니다.


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


마무리


영어권 국가였으면


댓글을 달아 주세요