리다이렉트 / 포워드

파일 세팅

 

간단하게 로그인 폼 작성

 

redirect 와 forward 차이

 

redirect : 사용자가 주소를 전달받아 서버에 다시 요청한다 ( 즉, get 방식으로 요청된다, 파라미터 값이 전달되지 않음 )

forward : 사용자가 요청하는 것이 아니라 서버에서 돌려주는 것이라 요청방식이 유지되며 파라미터 값, Attribute 값이 그대로 전달된다 >> forward 를 사용하는 경우 웹 출력 화면이 변해도 ( 실제 출력되는 jsp 파일이 변해도 ) url 은 첫 요청 페이지에서 변하지 않는다.

 

로그인 정보 일치 시 forward 를 사용하여 파라미터 값과 Attribute 값을 success.jsp 에 전달하여 사용

 

코드 실행 영상

 

 

- 차이점 리뷰 -

로그인 성공 시 forward 로 success.jsp 로 넘기며( 서버에서 처리 ), 로그인 실패 시 redirect 로 다시 login 페이지로 이동 >>

1. 콘솔창에 뜨는 method 와 파라미터, Attribute 값이 redirect 에서는 소멸, forward 에서는 그대로 남아 이동되는 것 확인

2. forward 로 이동 시 url 이 처음 접근한 url 이고 ( 서버에서만 처리하여 보여주는 것이기 때문 > 그렇다고 서버에서 Controller 를 거쳐 출력되는 것이 아니라 그냥 jsp 파일만 출력할 뿐 > 고로, 연산은 따로 진행되지 않음 ) redirect 로 이동 시 url 이 처음 접근한 url 이 아니라 변경 요청된 url 임을 확인 ( 서버가 주소를 클라이언트에게 전달하여 클라이언트가 다시 서버로 요청 )

728x90

 

 

 

 

 

어노테이션

어노테이션

: 어노테이션을 붙이면 프로젝트 실행 시 빈 객체로 등록된다 ( = 생성자가 실행된다 )

 

파일 세팅

 

어제 세팅해둔 com.care.ex01 을 com.care.ex02 로 변경

 

Controller, DAO, Service 에 각각 기본 생성자 생성 후 콘솔에 출력되게끔 하고 Controller 에만 어노테이션을 적용하여 실행

어노테이션이 붙으면 서버 실행 시 빈으로 등록되어 생성자가 실행된다 >> Controller 의 생성자만 실행되는 모습

 

DAO 와 Service 에 @Component 어노테이션을 붙여서 실행 >> 콘솔 창 출력

 

이번에는 DAO 에는 @Repository, Service 에는 @Service 어노테이션을 붙인 뒤 실행 >> 콘솔 창 확인

 

어노테이션은 종류에 따라 기능적 차이는 없고 빈 객체로 등록만 시킬 뿐이다...

예를 들어 Service 클래스에 @Controller 어노테이션을 붙여도 문제가 생기지 않는다

( 즉, 이름만 구분지어 놨을 뿐 기능 상 차이는 없다 )

 

 

 

 

 


 

 

 

 

 

만들어진 빈 객체를 꺼내오는 방법

만들어진 빈 객체를 꺼내오는 방법

 

Controller 에 코드 작성 후 서버 실행 ( MemberService 변수 생성, RequestMapping 을 사용하여 ex02/index 경로로 오는 내용을 처리 )

 

@Autowired 어노테이션을 사용하여 서버를 재시작 후 페이지에 접속하니 이미 등록된 service 객체를 불러오니 객체 값이 출력된다

 

Controller 에서 Service 쪽에 getData 메소드에 model 전달

 

Service 에 getData 메소드 생성 후 저장 > 웹 재접속 시 콘솔창에 출력되는 내용 확인

 

Service 에서 DAO 로 접근해야 하므로 Autowired 이용하여 DAO 객체를 불러와서 사용 >> DAO 의 메소드를 사용할 코드 작성

 

DAO 에서 값을 리턴 >> Service 에서는 해당 내용을 msg 변수로 받아 model 에 msg 라는 키로 저장

 

jsp 에서 전달받은 model 의 저장값 출력되는 것 확인

 

root-context.xml 파일에서 MemberService 를 abc 라는 빈 객체를 생성 >> MemberSerivce 에서 어노테이션에 빈 객체의 이름을 명시하여 저장

>>> 에러가 발생, Autowired 는 자료형을 기준으로 먼저 찾고 자료형이 같은 객체가 2개가 존재하면 이름으로 찾는데 현재 빈 객체에 MemberService 자료형이 두개 존재하므로 이름으로 찾기를 시도하지만 Controller 에서 설정한 변수 이름인 ms 와 동일한 이름을 가진 빈 객체를 찾지 못해 주입하지 못하고 오류가 발생된다.

 

빈 객체의 이름과 Autowired 로 호출하는 변수의 이름을 일치시키면 정상적으로 작동한다.

 

root-context.xml 에 DAO 빈 객체 등록 ( 아까 어노테이션으로 DAO 객체를 설정해놨으므로 Service 쪽 DAO 변수에 설정한 Autowired 에서 문제 발생 ) >> Service 에서 @Inject, @Qualifier 어노테이션을 사용해서 빈 객체의 이름을 지정하여 주입해서 사용할 수 있다.

 


 

 

 

 

GET, POST 전송 방식 처리하기

index.jsp 에 get 방식 전송과 post 방식 전송 코드 작성

 

웹에서 전송을 클릭하면 Controller 로 넘어올테니 Controller 에 코드 작성 및 result 페이지 작성

 

@RequestMapping 을 사용하면 get 방식과 post 방식을 모두 받을 수 있음

 

Controller 에서 RequestMapping 어노테이션에 GET 방식만 받게끔 설정 후 POST 방식으로 전송하여 확인 >> 405 에러 출력 ( GET 방식만 받도록 설정했기 때문 )

 

Controller 에서 전달받은 파라미터 값을 model 에 담아서 jsp 로 전달 >> jsp 파일에서 출력

 

입력 전송 > 확인 ( 파라미터 값이 model 객체를 사용하여 잘 넘어가는 것 확인 )

 

이번에는 POST 방식을 처리해볼 것임

 

PostMapping 으로 동일한 경로로 post 로 넘어오는 값을 처리 ( 어노테이션을 사용해서 넘어오는 값을 변수로 저장 ) > 웹에서 확인

@RequestParam 을 사용해서 input 태그에서 넘어오는 이름을 가지고 변수로 저장해서 사용.....

 

Controller 에서 최상단에 ex02 경로를 RequestMapping 으로 설정해주면서 하위에 동일 경로인 ex02 경로를 모두 생략할 수 있게 해준다

 

 

 

 

 

DTO 를 활용하여 파라미터 값을 받는 방법

 

DTO 생성 및 작성 ( getter / setter )

 

jsp 파일에 DTO 활용해서 넘길 폼 작성

 

Controller 에 DTO 를 활용하여 값을 받게끔 설정 >> jsp 파일 작성

 

전송 >> 확인

 

DTO 를 활용해서 받으면 넘어오는 파라미터의 이름과 DTO 의 변수 이름이 같으면 자동으로 값을 주입해준다

 


 

 

 

 

 

실습 예제

실습 예제

 

예제 풀이

프로젝트 생성 및 파일 세팅

 

버전 세팅

 

버전세팅 이후 프로젝트 업데이트 진행 ( 변경된 버전으로 사용하기 위해서 )

 

인코딩 오류 해결

 

Controller 에 index 페이지를 작성

 

register 에 대한 경로를 get 방식과 post 방식으로 분류하여 post 방식으로 들어오는 경우 회원가입 로직을 처리한 뒤 index 페이지로 반환

 

정상적으로 post 와 get 방식으로 들어오는 경우 경로를 나눠 출력하는 모습

 

입력 정보를 그대로 받아올 DTO 작성

 

Controller 에서 회원가입에 대한 정보를 DTO 객체로 받아온 뒤 Service 로 넘겨준다 >> Service 에서는 DAO 로 dto 객체를 저장하기 위해 넘겨준다 >> DAO 에서는 list 에 dto 객체를 저장한다

 

회원 목록보기 구현

 

Controller 에 경로 작성 후 list.jsp 에 넘겨줄 model 객체 만들어서 Service 에 전달 >> Service 에서는 DAO 에서 getList 메소드를 사용한 값을 model 에 list 라는 이름으로 저장한다 >> DAO 에서는 list 의 값을 리턴해준다

 

list.jsp 에 list 에 내용이 없을 시 출력될 내용과 내용이 있을 시 출력될 내용 작성

 

코드 실행
728x90

 

 

 

 

 

MVC2 모델

MVC2 모델

Controller : url 연결 역할

Service : 연산 역할

DAO : DataBase 접근 역할

 

Spring 동작 구조

 

클래스 파일 생성

 

root-context.xml 파일에 bean 객체를 생성한 뒤 서버를 재시작하니 Test.java 에 생성자가 실행되는 모습 > 즉, Test.java 객체가 서버가 실행될때 생성된다

추후에 root-context.xml 파일 안에 DB 관련된 설정을 하게된다 ( 서버 실행시 DB 객체를 생성해놓기 위해 )

728x90

 
 
 
 
 

인코딩 설정, 포트 에러, Context 에러, 경로 설정, Controller

Spring Legacy Project 새로 생성

 

생성된 프로젝트에서 pom.xml 파일 안의 자바와 스프링의 버전을 변경 후 저장 >> Maven Dependencies 의 버전이 변경되었는지 확인

 

javax.servlet-api

 

maven 버전 변경, java 버전도 1.8 로 변경

 

프로젝트 업데이트 진행

 

Ctrl + F11 >> Finish

 

서버가 실행되었지만 인코딩 오류로 인해 글자가 깨짐

 
▼ 인코딩 해결 코드 ▼

encodingFilter.txt
0.00MB

 

위 파일 내용 복사 후 진행

 

src > main > webapp > WEB-INF 폴더 내의 web.xml 파일에 해당 코드 붙여넣기 ( 인코딩 관련 코드 )

 

열려있던 웹 창 종료 후 프로젝트 클릭 > Ctrl + F11 클릭하여 재시작 시 한글이 깨지지 않고 정상적으로 출력됨

 
 
 
 
 


 
포트 충돌 에러가 발생하는 경우
 

서버 더블클릭 후 포트 정보를 변경

 


 
경로 충돌 에러가 발생하는 경우
 

여러 실습을 진행하면서 ex01 이라는 경로를 다른 파일에서 실행하더라도 경로가 겹쳐서 저장되게 된다, 그러므로 server.xml 에서 등록된 Context 를 주석처리해준 뒤 실행해준다

 


 
 
 
 
 

웹 브라우저 출력되는 부분을 보기 편하도록 Chrome 으로 변경 > 서버 실행 시 크롬으로 출력되는 것 확인

 

General - Workspace - Other : UTF-8 설정

 

CSS, HTML, JSP 파일 모두 인코딩 방식 UTF-8 로 설정 후 저장 종료

 

Controller 를 변경하여 default 경로를 /member 로 변경 후 접속 테스트 > 정상적으로 /member 경로로 접근할 때만 접속됨

 

테스트용으로 설정해둔 것이기 때문에 다시 돌려놓음

 

연습을 위해 MyController.java 와 jsp 파일 세개 를 폴더에 세팅

 

index.jsp 간단하게 작성

 

MyController.java 에 경로를 추가 후 서버 재실행하여 index 경로로 접속 >> 정상적으로 컨트롤러를 거쳐 웹 출력

@Controller 어노테이션 : 경로를 지정하는 클래스라는 걸 선언
@RequestMapping 어노테이션 : 경로를 설정 ( 따로 선언하지 않으면 GET 방식과 POST 방식을 모두 받을 수 있음 )
return 값에는 출력될 jsp 의 경로가 들어간다

 

@GetMapping 을 사용하여 접속

@GetMapping 어노테이션 : GET 방식의 요청을 처리

 

model 에 키와 값을 저장하여 전달 >> jsp 파일에서 키로 값을 꺼내서 사용 >> 출력

 

ModelAndView 를 사용하여 jsp 파일로 넘길 모델과 출력될 jsp 를 모두 설정 후 리턴으로 모델을 반환하여 출력

 
 
 
 
 


실습 예제

실습 예제

 

예제 풀이

예제 풀이

절대 경로로 설정하려면 /ex01/index 와 같이 설정
혹은 만약 경로가 변경될 일이 있을 수 있기 때문에 <%= request.getContextPath() %>/index 와 같이 표기하는 것이 가장 좋다
<%= request.getContextPath() %>/login
<%= request.getContextPath() %>/logout


728x90

 

 

 

 

 

Interface

Interface 생성해서 사용할 클래스 파일 4개와 Interface 파일 하나 생성

 

CarService 인터페이스 파일에 메소드 추가

 

CarServiceImple01.java 에서 CarService.java 를 상속받은 뒤 오버라이딩

 

MainClass 작성

 

SubClass.java 작성 후 MainClass.java 실행

 

만약 기능을 변경해야 하는데 변경해야될 부분이 너무 많다고 가정

 

기능 변경이 구현된 CarServiceImple02.java 작성

 

application_car.xml 생성 및 작성

 

MainClass.java 와 SubClass.java 의 생성자를 통해 사용하던 코드를 주석처리 하고 xml 에서 설정한 값을 받아서 처리하는 코드로 변경 후 실행 => 기존과 동일하게 작동

 

xml 에서 class 를 기존의 CarServiceImple01 에서 CarServiceImple02 로 변경했다면 >> xml 파일을 통해 가져와서 처리되므로 모든 해당 코드가 들어있는 모든 코드가 변경되어 실행된다

728x90

 

 

 

 

 

설정 파일에 변수 설정하여 사용하기

 

src/main/resources 안에 file 을 추가

 

파일 명 설정

 

설정 값을 저장하는 파일을 생성

 

db 설정에 관련된 내용을 파일에 추가

 

MainClass.java, DBClass.java 파일을 생성

 

DBClass.java 에 id 와 pwd 라는 변수를 생성 후 setter / getter 생성

 

기본 생성자와 아이디와 비밀번호를 받는 생성자 선언

 

resources 에 application_db.xml 파일 생성 및 작성

 

MainClass 작성 및 콘솔 결과 값 확인

 

db.properties 파일을 불러오기 위해 context 기능을 추가

 

context:property-placeholder 를 사용하여 db.properties 파일을 불러와서 사용

 

파일 안에서 선언한 변수를 사용할 때에는 ${} 를 사용하여 변수를 사용한다

 

MainClass.java 에서 파일의 변수로 생성자를 통해 생성한 db02 객체를 가져와서 출력 ( 콘솔 창 결과 값 확인 )

 

>>> 기본 생성자로는 기존에 사용하던 방식으로 먼저 객체를 생성하여 그 객체 안에 id 와 pwd 값을 xml 파일에서 property 를 사용하여 값을 주입하여 사용

>>> 두번째 방식은 이미 존재하는 값을 file 로 저장하여 파일 안의 내용을 불러와 id 와 pwd 값을 필요로 하는 생성자를 사용해서 사용

 


 

 

 

 

 

ArrayList 와 HashMap 에 xml 파일로 값 주입해서 사용하기

ListArray 와 HashMap 을 xml 파일로 설정해서 사용해 볼 것임 ( seter / getter 사용 )

 

방금 생성한 list 와 map 의 값을 xml 파일을 통해 주입해서 사용

 

MainClass.java 에서 출력해서 확인

 

ArrayList 와 HashMap 에 xml 파일로 값 주입해서 사용하기 완료

 


728x90

 

 

 

 

 

IOC, DI ( Dependency Injection )

IOC

IOC : 객체들을 저장하고 있는 틀

( 기존에는 new 연산을 사용해서 객체를 사용했으나, 스프링에서는 new 연산을 사용하지 않고 특정 객체를 미리 만들어 특정 저장소에 저장해둔 뒤 객체를 꺼내서 사용한다, 이때 객체를 저장하고 있는 틀이 IOC 이다 )

DI

DI : 의존관계 주입 기능

( 객체를 만들었을때 또 다른 객체와 연결되어 잇는 경우 의존 관계가 있다 )

ex) 칼이라는 객체가 있다.... 또 주방장이라는 객체가 있는데 주방장이라는 객체는 칼이 있어야 요리를 할 수 있으므로 주방장 객체는 칼에 대한 의존 관계이다.

 

 

 

 

 

xml 파일을 통해 객체를 만들어 사용하는 방법

Spring Legacy Project 생성

 

이름 짓고 Spring MVC project 선택 후 Next >

 

패키지 이름을 url 형식으로 만든 뒤 Finish

 

프로젝트 우측 클릭 > Maven > Update Project 클릭 하여 프로젝트를 업데이트

 

객체를 생성할 클래스 파일 생성

 

STBean.java 파일 작성

 

Student 클래스 파일 작성하여 작성

 

메인 클래스 생성

 

메인 클래스 작성

 

콘솔창에 출력됨

 

STBean 에서 변수를 생성 후 Student 클래스의 객체를 생성하여 안의 메소드를 사용 > 즉, STBean 이 객체를 연결시켜주는 DI 역할을 한다 ( 기존에 자바를 사용하던 방식 )

 

이제는 스프링에서 사용하는 DI 형태를 사용할 것임

 

스프링에서 사용하는 형태의 DI 를 사용할 것임, 패키지 생성 후 MainClass 생성

 

Spring Bean Configuration File > xml 파일 생성

 

이제 xml 안에 객체를 생성할 것임

 

id : 객체 이름, class : 객체 경로

 

id : 객체 이름, class : 객체 경로

 

st01 객체를 st 라는 이름으로 의존성을 주입한다는 의미 ( Beans Graph 를 눌러서 시각적으로 확인 가능, 돌아가려면 Source 클릭 )

 

이제 MainClass 에서 해당하는 값을 꺼내와서 사용할 것임

 

xml 파일에 선언해 놓은 객체를 GenericXmlApplicationContext 를 사용하여 경로를 불러와 변수로 담아 사용

 

이번에는 setter 로 객체에 내용을 생성하는 것이 아닌 xml 파일을 사용해서 값을 넣어서 사용 > 실행 결과

 

 

 

 

 

실습 예제

실습 예제

 

예제 풀이

파일 세팅

 

PrintBean.java 추가 작성

 

xml 작성 ( PS 객체를 생성하여 PB 객체 안의 ps 에 의존성을 주입 )

 

메인 클래스 작성 후 실행

728x90

 

 

 

 

 

Spring 설치 및 프로젝트 생성 시 오류 설정

 

spring 이 설치되어 있는 eclipse (sts) 설치

 

Spring Tool Suite 3.9.14 - New and Noteworthy

Spring Tool Suite 3.9.14: New and Noteworthy Important Note This is a minor bugfix and maintenance release that we ship to our existing STS3 users beyond the announced maintenance lifespan for your convenience. We strongly recommend to update to the new Sp

docs.spring.io

STS3 버전 사용할 것임

 

google 에 sts3 검색해서 나오는 페이지 들어간 뒤 다운로드 링크 클릭

 

상단의 zip 파일 다운로드

 

다운로드 완료

 

압축 해제

 

압축 해제된 폴더 안에 sts-3.9.18.RELEASE 폴더 안에 STS.exe 가 존재

 

STS.exe 실행

 

workspace 설정

 

기본으로 설정되어 있는 서버와 서버 파일 삭제

 

둘 다 삭제하면 왼쪽 화면은 빈 화면이 된다

 

서버를 Tomcat 9.0 으로 추가해 줄 것임

 

서버 Tomcat 9.0 으로 지정 및 Tomcat 9.0 폴더를 지정

 

톰캣 경로를 잡아준 뒤 Finish

 

잠시 STS 종료 후 진행

 

spring-master.zip
0.01MB

 

위 zip 파일 다운로드 받아 압축 해제

 

압축 해제 후 spring > spring-master 폴더에 plugins 폴더 접속

 

위에서 압축을 해제한 plugins 폴더 내의 설정 파일을 복사하여 workspace 폴더 내의\spring\workspace\.metadata\.plugins\org.springsource.ide.eclipse.commons.content.core 위치에 붙여넣기

 

Spring Legacy Project 생성

 

처음 프로젝트를 시작하면 오류 발생

 

다시 STS 종료 후 아래 과정 진행

 

위에서 압축을 해제한 sts템플릿 폴더 내의 설정 파일을 복사하여 workspce폴더 하위의 \spring\workspace\.metadata\.sts\content\org.springframework.templates.mvc-3.2.2 경로 내에 3가지 파일을 붙여넣기

 

다시 STS 실행

 

이번엔 정상적으로 Spring MVC Project 가 생성된다.

728x90

+ Recent posts