JSP를 이용한 웹페이지 작성 과정에서 


MVC 패턴을 좀더 명확히 적용하기 위해, 그리고 가독성이나 편의성 등을 위해


<% %> 등의 기호를 사용하여 자바 언어를 작성하는 것보다 JSTL을 이용하는 경우가 많더라.


문법이 크게 어렵거나 한 건 없지만, 자꾸 까먹을 때가 있어서 정리.



0. JSTL을 사용하기 위해

프로젝트 패키지 내에 해당 라이브러리를 삽입하여 import 해주는게 일반적인 것 같고,

혹시 import할 라이브러리가 없다면 아래와 같은 방식으로 추가해주면 사용 가능하다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>


1. <c:if>

<c:if test="조건식">실행문</c:if>


2. <c:choose>

<c:choose>

<c:when test="조건식">실행문</c:when>

<c:when test="조건식">실행문</c:when>

<c:otherwise>위조건에 해당하지 않을경우 실행문</c:otherwise>

</c:choose>


3. <c:forEach>

forEach의 경우 예시를 들어서...

<c:forEach var="car" items="${carList}"

<tr>

<td><c:out value="${status.count}"/></td>

<td><c:out value="${car.name}"/></td>

<td><c:out value="${car.num}"/></td>

</tr>

</c:forEach>



자바(JAVA) 형 변환(String과 Date)



String to Date


String from = "2013-04-08 10:10:10";

SimpleDateFormat transFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Date to = transFormat.parse(from);




Date to String


Date from = new Date();

SimpleDateFormat transFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String to = transFormat.format(from);


자바(JAVA) 형 변환(String과 int)



Strinig to int


String from = "123";

int to = Integer.parseInt(from);



int to String


int from = 123;

String to = Integer.toString(from);


4일차는 코딩 위주로 수업해서 생략

 

 

 

#
URL에 따라서 다른 서블릿을 호출하게 되면 서블릿을 여러개 만들어야 하니까,
DisPpatcher Servlet 하나만 사용하고
URL 자체를 명령어로 인식해서, cmd라는파라미터에 따라 액션을 다르게 한다.
어떤 URL이 어떤 명령어인지는 Handler Mapping이 알아서 해주고,
여기서 어떤 명령어인지를 판단하여 Controller를 부른다.
Controller에서는 직접 코딩하여 모델을 만드는게 아니고,
Controller에서는 의지하는 객체를 가지고 있는거...
의지하고 있는 객체는 모델이 되겠지?
이 모델은 또 구현클래스로 두지 말고,
인터페이스를 만들어 추상화하여 loose coupling을 한다.
=> 결합도가 낮아져서 다형성을 가진다.
이때 단순히 인터페이스만 가지고 있는다고 결합도가 낮아지는건 아니고,
팩토리 패턴을 생성하여 어떤 케이스에 따라 어떤 구현 클래스를 사용할지를 결정.


#
SPRING에서는 forward가 디폴트
forward는 url은 그대로 두고, 버퍼의 내용만 변경
다른 컨트롤러 쪽을 호출하기 위해서는 url이 변경돼야 하기 때문에 redirect를 사용
다시 정리해보자면,
action에서 바로 뷰를 보여줄 때는 forward로 가면 되는데
action에서 다른 action으로 가려면 redirect로 가야한다.


#
ORM, AOP, DI 등의 개념은 확실히 알아둡시다.


#
AOP(Aspect Oriented Programming)
관점 지향 프로그래밍. Aspect가 키워드!!!
OOP를 날려버리자 하고 나온게 AOP가 아님
(AOP가 도입된다고 OOP가 사라지는게 아님)

OOP의 장점은 재사용성(중복코드가 줄어듬)
OOP의 단점은 필요없는거까지 상속받는다.
OOP에서는 재사용하기 위해서는 주종관계로 묶여져야 한다는 단점이 있음.

AOP에서는 바라보는 관점에 따라서 핵심코드와 공통소스가 캡슐화되게 해서,
주종관계를 맺지 않고 재사용이 가능.
이때 관점이라는걸 정의하기 위해서 아키텍쳐가 필요.
핵심과 공통을 분리하기 위함이 AOP의 목적.
분리를 하게 되면 뭐가 뭔지 모르기 때문에 이 핵심코드와 공통소스 캡슐화 등을 알아서 해주는걸 각종 프레임웍에서 문법에 의해 해준다.

운전을 예로 들면, 운전을 하기 위해 차를 빼고 다시 주차하는게 공통소스
운전을 해서 여행을 가든 출퇴근을 하든 하는게 핵심코드
운전자가 원하는건 운전을 하는거지, 차를 빼고 주차하는게 아니다.
이 차를 빼고 주차하는걸 공통소스로 관리.

밥먹는걸 예로 들면, 밥을 먹기 위해 상을 차리고 다먹고나서 설거지를 하는게 공통소스
밥을 어떻게 잘 먹는게 핵심코드
식충이가 원하는건 밥을 먹는거지, 상을 차리고 설거지를 하는게 아니다.
이 상을 차리고 설거지를 하는걸 공통소스로 관리

*advice : what과 when이 결합된 것
공통관심 사항을 핵심로직에 언제 적용할 것인가를 정의

*joinpoint : where의 의미
공통관심사항을 적용할 수 있는 애플리케이션의 실행지점
advice를 적용하는 지점

*pointcut : advice가 실제로 적용되는 jointpoint

#
오늘 MVC Spring, DB적용
다음시간에 DI적용하여 어플만듬
그다음시간에 AOP 등 마무리


#
ORM은 Object Relation Mapping : 즉, 다른 프레임워크와 연동하는 것.


#
Spring MVC
Model : 모델 자체가 컴퍼넌트, 컴퍼넌트 자체가 자바로 코딩한 비즈니스 로직.
View
Controller
모델과 뷰를 구분하고자 하는 형식이 MVC
여기서 모델이 주코드와 부코드로 나뉘게 됨.


#
<Spring MVC의 큰 흐름>

1.
Client에서 Dispatcher Servlet으로 가는건, web.xml에서 설정
(.do일때 이 서블릿으로 가라는걸 설정.)
서블릿은 요청을 처리해주고, 전체 관리하는 역할을 함.
Dispatcher 서블릿은 Spring에서 제시하는 서블릿.

2.
이때 .do로 통일하면 하나의 서블릿이기 때문에, 어떤 서비스를 해야할지 단서를 붙여서 호출해야 하는데
이걸 해주는게 Handler Mapping(기존 MVC에서는 'list.do?cmd=login' 이런식으로 처리했음)

3.
Dispatcher 서블릿에서 이 호출이 어떤 요청인지 Handler Mapping을 통해서 판단
(커맨드와 비즈니스 로직을 맵핑)

4.
 Controller는 기존MVC의 Action과 같은 역할.
컨트롤러에서 비즈니스 로직 등을 구현.
DI를 적용시켜서 로직, DB 등과 관련된걸 불러오고 처리.

5.
ActionForward를 통해서 ModelAndView를 설정하여 Dispatcher Servlet으로 넘김

6.
Dispatcher Servlet에서 ViewResolver를 불러서 어떤 뷰를 불러올지 결정


#
211.63.89.30

#
샘플로 만든 MVC프로젝트에서,
jsp에서 .do?cmd=login url 이동
=> web.xml에서 읽고 Action Servlet으로 가서 service 메서드 호출
=> ActionServlet에서 cmd를 받아서, getAction 호출
=> Action Factory의 getAction에서 cmd 값에 따라서 어떤 모델을 부를건지 결정
=> 이 받은 action을 가지고 action.execute 실행
=> execute를 ActionForWard가 받아서, true면 sendRedirect// false면 requestDispatcher 호출

#
객체를 속성과 기능과 함께 인스턴스화 할 때(OOP) 한계가 있다
그래서 객체를 만들어서 서로 협업(조립)시킨다 => Framework

설계도(클래스, 객체)를 만드는 이유 : 재사용성을 위함

Spring에서의 협업 : Extend가 아니라, POJO(평범한 자바)로 가지고 있는(haser) 개념으로 가고, 이를 이용해 협업한다. 이때 코드를 분리하고 조립(factory)하게 된다.

메인부에서 객체를 선언하고, 어떤걸 만들지 조립하고, 호출하는게 일반적인 개발의 흐름
근데 이렇게 하면 개발자가 공식대로 다 만들고, 일정한 패턴으로 코딩해야함
프레임워크에서는 IOC 컨테이너를 서비스해서, 얘네 문법만 익히면 기본적인 패턴이나 문법이 적용된 상태로 코드를 분리할 수 있고 조립할 수 있다

Spring 모듈중에 Core가 있고, 그 안에 DI가 있음. 이는 협업하는 객체를 wiring해줌. => 코드의 분리 + 확장성 향상

문법에서 set은 집어넣고, get은 반환하는 건데..
@Required를 하면 반드시 DI를 하도록 한다.
@Autowired를 하면 자동으로 묶어준다.(DI해준다)

xml을 보면 bean으로 객체를 만들고, property를 만듬.
예시에서 person이 book을 가지고 있다.
book이 1개뿐이면 person과 book이 같은 타입이니까 잘 가져오게 되는데(book을 person에 DI시키는데),
book이 2개라면 타입이 겹치니까 이름으로 가져올 수밖에 없음. => annotation으로 해결 가능

setBook에 @Requried만 쓰면 에러가 남(DI를 안 해놨으니까)
거기에 @Autowired를 추가하면 에러가 사라짐(하나하나 bytype으로 DI가 되니까)
참고로, 바로 bean에 접근하는 resource 개념이 있음
그리고 bean에 안 만들어줘도 다른 annotaion을 이용해서 가능하도록 할 수 있다.

내가 primitive 자료형(기본자료형) 혹은 레퍼런스 자료형(오픈 api)를 가지고 있을 수 있는데,
이를 DI시켜서 루즈 커플링해서 사용하는게 spring framework의 핵심

spring에서는, xml뿐만 아니라 java 소스만으로 DI를 시켜줄 수 있도록 제공한다(@bean).
기존의 방식인 xml로 DI시키는 것도 있고, java 소스로 DI시키는 것도 있고 함께 사용할 수 있음.

 

#
@Qualifier를 사용하면 값을 넣을 수 있음
setBook 메서드 위에다가 쓰면 객체가 하나라면 괜찮은데 여러개일 경우 여러개에 모두 한 value만 들어가게 되니까, 파라미터에다가 하나씩 붙여주면 값을 넣을 순 있음.

 

# MVC
- 웹은 전부 MVC로 되어있음(Spring, 전자정보 등등)
- 모델과 뷰를 분리함

 

# Spring MVC
- Client가 Dispatcher Servlet을 호출(요청을 위해)
=> 이때 Spring에서는 url 전체를 command로 본다.
- 서블릿이 호출되면 Handler Mapping이 불러와짐(키, 밸류 형태로 어떤 액션을 할지 맵핑)
- 핸들러맵핑이 확인해서 관련된 컨트롤러를 불러옴
- 컨트롤러가 ModelAndView를 디스패쳐 서블릿에 넘겨줌
- 확인해서 ViewResolver를 불렀다가 View를 볼러옴

#
http://www.springsource.org/download/community
위 링크 통해서
spring-tool-suite-3.1.0.RELEASE-e3.8-win32-installer
spring-framework-3.0.1.RELEASE-A-with-docs
spring-framework-3.0.1.RELEASE-A-dependencies
다운로드

 

#
framework : 작업환경
spring : 봄 =. 따뜻한 환경에서 공부하라고 로드존스가 만듬
spring framework : 오픈API, 경량의 컨테이터

 

#
IOC 패턴 : 제어 역행. 프로그램의 흐름이 역으로 변하는 것.
일반적인 흐름 필요한 객체를 생성 -> 조립을 함 -> 호출함
제어역행은 객체를 만들고 조립하는 과정을 위임하는 것(spring framework한테 위임)
http://vandbt.tistory.com/43

 

#
팩토리 : 객체를 어떻게 생성할 것인가, 어떻게 조립할 것인가, 생성한 객체를 어떻게 돌려줄 것인가를 고민하는 방법


#
POJO(Plain Old Java Object)
: 옛날 자바. Extend Object가 생략되어있고, Action으로부터 상속을 받음.
단일상속을 사용하면 inner class를 사용해야하고 확장성이 적고 등등 여러가지 문제
이저가 아니라 해저로 하자(가지고 있자).
만약에 그 레퍼런스가 없으면 내가 다 만들어야 하잖아
객체가 들어와야 하는데 구현객체가 들어오면 안되니까, 패턴에 의해서 framework로부터 그걸 받는다
포조가 나왔기 때문에 spring이 더 발전하지 않았나...

 

#
Spring framework 모듈 구조
OOP 기반이고, AOP가 OOP를 도와주는 개념으로 들어옴. AOP는 원래 있던 이론인데, 이를 spring에서 도입해서 개발자에게 서비스 하는 것임
Core에는 IOC 개념이 들어감
ORM에는 객체를 연결해서 매핑. 다른 프레임웤과 연동할 때 사용
DAO는 JDBC 사용을 지원하기 위함.
스프링 MVC 를 알기 위해서는 일반 MVC가 뭔지 알아야 이해가 됨

 

#
팩토리 패턴

 

#
스트레이지 패턴

 

#
커맨드 패턴

 

#
DI모듈

 

#
spring-tool-suite-3.1.0.RELEASE-e3.8-win32-installer 설치
STS.exe 실행하여 뉴프로젝트 - 스프링프로젝트 생성함
뉴 패키지, 뉴 클래스 생성
java 파일 안에 private 2개 만든다음에
ctrl + space + o 로 객체 생성
java파일 우클릭 - new - spring configuration.. .눌러서 xml 파일 생성

* bean : IOC 기반의 factory.
bean에 id, name있음. id가 좀 더 제약이 없기 때문에 id를 보통 씀
bean에 class경로 잡아줌 => 실질적으로 일할 땐 어노테이션을 많이 씀(class 일일이 잡아줄 필요 없음)
scope에 있는 prototype : 매번 계속해서 객체가 생성됨, singleton : 한번만 생성됨(static개념). 디폴트는 싱글톤.
property로 넣으려면 getter, setter가 생성되어있어야 함
alt + shift + s => r 누르면 getter .setter 생성
alt + shift + s => s 누르면 toString생성됨

*spring container = ioc container

*bean들만 팩토리하는게 beanFactory

 

#
플럭시 패턴

 

#
Dpendency Injection(DI : 의존성 주입)
A클래스와 B클래스가 있을 때 B를 A로 DI하게 되면, B의 소스를 고칠 때 A에 있는 수많은 사용부분을 고쳐야 하게 된다.(결합도가 너무 높다)

 

#
bean 아래의 constructor 생성 관련 교육

 


JSP 공부하면서 이해한 쿠키(cookie)에 대한 기본 내용을 정리해본다.


 1. 클라이언트에 쿠키가 없을 때

1) 클라이언트가 서버로 처음 접근(첫 요청)
2) 서버에서 응답 받음
3) 쿠키 생성
4) 응답에 쿠키를 포함하여 전송
5) 클라이언트의 요청에 대한 서버로부터의 응답(to클라이언트)
6) 클라이언트 쪽에서 서버의 응답에 실려온 쿠키를 저장함


 2. 클라이언트에 쿠키가 있을 때

1) 클라이언트가 쿠키정보와 함께 요청을 보냄
2) 서버로 접근(쿠키가 저장된 이후 모든 요청)
3) 서버측에서 클라이언트의 요청에 담긴 쿠키 정보를 읽음
4) 쿠키정보를 읽어 이전 상태에 대한 정보를 파악
5) 응답에 다시 변경된 쿠키를 재전송



출처 : 기초부터 차근차근 jspstudy의 JSP 웹프로그래밍 입문 (삼양미디어 출판)

JSP 공부를 하다가 Cookie와 관련된 예제를 코딩하는데, 아래 줄에서 에러가 발견됐다.

Cookie cookie=new Cookie(cookieName, "Apple");

에러가 뭐 때문인지 살펴보니...

 Access restriction: The type Cookie is not accessible due to restriction on required library ...

요런다.


jre 라이브러리 중에서 servlet-api.jar가 문제라는 메시지였는데, 구글링 잔뜩했더니 project properties에서 Java - Compiler - Erros/Warnings에 들어가 Forbidden reference 부분을 Error가 아니라 Warning으로 수정하라는 내용이 대부분이었다.

하지만 이렇게는 근본적인 문제해결이 되지 않는것 같아 자바 Build Path도 수정해보고 별짓을 다했지만 되지 않아 포기하고 퇴근하려는 찰나! 해결책을 찾았다.

해결책 찾은 출처 :
http://stackoverflow.com/questions/860187/access-restriction-on-class-due-to-restriction-on-required-library-rt-jar/2174607#2174607

요지는 정말 쉽다.


 1. 이클립스에서 Project - Properties에 들어가서 Java Build Path에 있는 Libraries 탭에서 JRE System Library를 remove한다.

2. Add Library를 클릭하여 JRE System Library를 다시 추가한다.


끝!


회사에서 프로젝트로 리버스 엔지니어링을 하고 있는데, 아직 언어에 대한 감도 없는 상태에서 코드를 쳐다보다가 try catch 구문이 굉장히 많이 등장하길래 다시 되새겨볼 겸 간단히 정리해본다.

w3schools.com에서 JavaScript 슬쩍 보고 공부했을 때 분명히 try... catch 구문이 나왔는데 워낙 대충 봐서 뭔가 에러를 잡는건가 하고만 넘어갔는데, 상당히 쉽고 유용한 구문인듯!

 try
   {
   //Run some code here
   }
catch(err)
   {
   //Handle errors here
   }

위 내용은 try...catch 구문의 문법이다.(출처 : http://w3schools.com/js/js_try_catch.asp)

//Run some code here 라는 주석이 적힌 부분에 실행할 구문을 적고,
//Handle errors here 라는 주석이 적힌 부분에 에러가 생겼을 경우 실행할 구문을 적는다.

실행시키고자 하는 구문을 적고 에러가 생겼을 경우 alert를 띄우는 등의 액션을 해줄 수도 있고, 에러 log를 남길 수도 있다.

나중에 혼자 개발을 하게 될 경우 어디서 오류가 났는지를 체크할 수 있는, 혹은 운영하다가 오류를 체크하고 싶을 때 유용하게 쓸 수 있을듯하다.