Spring
h— layout: post title: “OMG SPING” date: 2018-07-01 10:59:21 +0700 categories: Language —
SPRING!
[참조]
: 각종 홈페이지 예제를 위주로 작성할 예정.
SPRIGN,JAVA가 익숙하지 않은 내가 SPRING 프로젝트를 해야 할때.
인프런의 강좌를 추천해 주셨지만, 그 강좌를 다 본다고 해서 프로젝트를 수월하게 할 것 같지 않다.
방향을 바꾸자 !!!
나는 방향을 바꿔서 강좌에 있는 강의 목록을 위주로 인터넷에서 예제를 찾아 가면서 공부할 예정이다. 각 강좌당 10개의 예제를 직접 작성해 보자.
강의 목록
- Spring Project 만들기
- Spring DI 예제
- Spring DI 활용
- Spring DI 설정 방법
- Life Cycle 생명 주기와 범위
- 외부 파일을 이용한 설정
- AOP
- MVC 기초
- Spring MVC 게시판
- Spring JDBC
- Controller
- Form data
@requestMapping
파라미터- Form data 값 검증
- Spring MVC 게시판
- Spring JDBC
- Spring Security
- Mybatis
될 수 있으면, 빨리 빨리 진행 하자. 다음 주 수요일 까지 spring과 oracle 연동이다.
주말에 각종 예제를 통해 이해를 하고 월요일 부터 DB 연동을 할 예정이다.
Spring Project 만들기
eclipse를 최신 버전으로 다시 설치 했다. Eclipse photon
[File] -> [new] ->prject -> Spring Lagacy Project -> Simple Spring Maven 을 선택해서 Project 명을 지정해 준다.
Project를 생성 후
[src/main/java] –> package 파일을 만들고 그 안에 java class를 작성해서 결과를 console 창에서 확인 한다.
Spring MVC project 예제 전까지 console창에 결과를 확인 할 것 같다.
Spring DI 예제
[목표] : 10개 정도 분석 할 예정이다.
DI : Dependency Injection
[참조] : http://private.tistory.com/39, https://m.blog.naver.com/PostView.nhn?blogId=sim4858&logNo=220935583802&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F, http://www.nextree.co.kr/p11247/
이주일 정도 걸린것 같다. 나의 공부 방식이 정말 잘못 됬다는 걸 깨닫는데. 엄청난 시간이 소요 됬다.
가장 중요한건 강의다. 강의를 위주로 공부의 뼈대를 정리 하자 그리고 책을 읽어서 살을 붙이자.
[강의] : 신입 프로그래머를 위한 자바 스프링 (Spring) 프레임워크 강좌
[강사 명] : Kim Myoung-Ho
[강의 홈페이지] : www.inflearn.com
1 강 . Spring 이란?
프레임 워크란?
특정한 목적에 맞게 프로그래밍을 쉽게 하기 위한 약속 입니다.
스프링 프레임 워크란? : 자바 언어를 기반으로 한 프레임 워크이다. 다양한 어플리케이션을 제작 하기 위한 약속된 프로그래밍 틀 이다. EJB에 비해 접근하기 쉽다.스프링 학습 이전에 Java, JSP and Servlet 에 대한 선행 학습이 반듯이 필요 하며, html, javascript, jqury, css등의 스크립트 언어도 기본적인 학숩이 필요하다.
아.. 젠장… spring 공부 이전에 java, jsp, servlet에 대한 이해가 많이 필요 하다고 한다. 지금까지 나는 깡으로 버텼구나. 그래 계속 깡으로 밀고 나가 보자. 할게 너무 너무 많다.
java sdk 설치 , 환경 변수 설치는 java posting에 해놨다. java도 계속 공부 해야 하는데…
일단 나는 eclipse Luna 버젼에서 하고 있다. 강의에 맞는 환경으로 하기때문인데. 일단 익숙해지면, 바꿀 예정이다.
Tomcat은 7.0버젼 (서버는 아니고 web container에 해당)을 설치 했고, eclipse에서 STS 라는 플러그인을 다운 받아서 설치 했다.
Tomcat eclipse 환경 설정
- eclipse -> show view -> servers 탭 선택
- 압축을 푼 tomcat 경로에서 tomcat 추가
- eclipse 상에서 tomcat 더블클릭
- [설정] -> port :8181이라고 설정 이유는 오라클 내부적으로도 http 프로토콜을 통해서 통신을 하기때문에 그부분에서 8080 포트를 사용해서 충돌이 날 우려가 있기 때문이다.
- servers locations 탭에서 use tomcat installation을 선택
- servers option 탭에서 Publish module context to seperate XML files 선택
- Modules auto reload by default를 선택
2 강. spring project 만들기
가장 먼저 eclipse에 spring plugin인 STS를 설치 한다.
eclipse market place -> sts 검색 -> sts installation
perspective도 spring으로 바꾼다.
spring project 1
- new -> project -> Spring Lagacy Project -> project 명 지정 -> Simple Spring Maven
- Package를 만들어 준다. Package 명은 폴더 경로와 같다.
Package : com.jevalec.ex –> com 폴더에 javalec 폴더 에 있는 ex 폴더를 의미 한다.
[코드] : paypulse.github 에 올라감.
DI와 IOC 컨테이너
spring은 IOC 컨테이너다.
스프링은 방법 2와 같은 방식을 채택하고 있는데, 외부에서 객체 생성후 setter나 생성자에게 값을 넣어주는데,
이것을 주입이라 하고,DI (Dependency Injection) 외부에서 객체를 만들어서 주입 하는 기법을 의미 한다.
인터페이스를 부품화 시켰고, 이렇게 부품화 시킨것을 담고 있는 것을 IOC 컨테이너라고 한다.
그리고 위 그림 전체를 스프링이라 한다.
결국 스프링이란? 부품을 생성하고 조립하는 라이브러리 집합체라고 할 수 있다.
앞으로 부품을 생성하고 부품을 조립하는 방법들에 대해서 살펴볼예정이다.
3강. DI(Dependcy Injection) 1
DI ,Spring의 가장 큰 특징이라 할 수 있다.
스프링을 이용한 객체 생성과 조립
스프링 == 생성과 조립
xml에서 <bean>
이라는 태그를 확인 할 수 있는데,
<bean>
<bean id="calculator" class="com.javalec.ex.Calculator"/>
이 의미 하는 바
- calculator 라는 객체는 실제로 com.javalec.ex.Calculator 입니다. 즉, 패키지 경로의 Calculator라는 클래스를 의미 한다.즉,bean 태그를 이용해 변수를 설정하고 객체를 생성한다.
- 외부에서 bean의 정보를 가져오기 위해 id를 사용하고, class type을 명시 한다.
즉, 직접 class로 생성 할 것을 가지고,spring에서는 bean 태그를 가지고 xml에서 생성해주는 방식이다.
<bean id="calculator" class="com.javalec.ex.Calculator">
<property name="calculator">
<ref bean="calculator"/>
</property>
<property name="firstNum" value="10"></property>
<property name="secondNum" value="2"></property>
</bean>
<property>
: 멤버 변수에 대한 값과 변수 명을 지정한다. 즉, 필드 설정
그렇기 때문에 멤버 변수와 동일 하게 맞춰야 한다.
getBean()
: getBean을 이용해 Bean에 관한 값을 가져 온다.
4강. DI(Dependcy Injection) 2
[기초 데이터 선언] : private String name;
<property name="name">
<value>홍길동</value>
</property>
[List 타입] : private ArrayList<String> hobbys;
<property name="hobbys">
<list>
<value>수영</value>
<value>요리</value>
<value>독서</value>
</list>
</property>
[다른 빈객체 참조] : private BMICalculator bmiCalculator;
<property name="bmiCalculator">
<ref bean="bmiCalculator"/>
</property>
String configLocation = "classpath:applicationCTX.xml";
스프링 컨테이너 생성(IOC 컨텐이너 생성)
AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation);
스프링 컨테이너에서 컴포넌트 가저 옮, 객체를 생성하고 조립하는것을 IOC 컨테이너가 한다.
MyInfo myInfo = ctx.getBean("myInfo", MyInfo.class);
myInfo.getInfo();
자원을 사용했으면, 해제를 해주는 습관을 들여야 한다.
좀 의문이다. java인데 가비지 컬렉터가 돌면서 알아서 해주지 않나?
ctx.close();
5강. DI활용
Dependency Injection [의존 주입]
[applicationCTX.xml] : 생성자를 이용한 방법
<bean id="studentInfo" class="com.javalec.ex.StudentInfo">
<constructor-arg>
<ref bean="student1"/>
</constructor-arg>
</bean>
[Java 파일] : setter()로 접근한 방법
Student student2 = ctx.getBean("student2",Student.class);
studentInfo.setStudent(student2);
studentInfo.getStudentInfo();
생성자를 사용할때는 <constructor-arg>
를 사용하고, Setter를 사용할때는 <property>
를 사용한다.
※ 질문 1 : 굳이 java에서 객체를 만들어서 구현하면되는데, 왜? xml 파일을 만들서 주입을 해야 하나?
인터페이스의 장점 : 타입을 통일 시킬 수 있고, 강제적으로 overried 해서 작업을 통일 할 수 있다.
혼자하는 프로젝트에서는 장점을 느낄 수 없지만, 팀 단위의 프로젝트에서 큰 장점을 발휘 할 수 있다.
Java 파일의 수정 없이 스프링 설정 파일만을 수정하여 부품들을 생성/조립 하고 있다.
즉, java 코드를 수정 하지 않아도 config 파일인 xml 파일만 변경해 주면 유지 보수 차원에서 빠르게 진행 할 수 있다.
6강. DI설정 방법
- XML 파일을 이용한 DI 설정 방법
<bean id="student1" class="com.javalec.ex.Student">
<constructor-arg value="홍길동"/> // 생성자 설정 (기초데이터)
<constructor-arg value="10"/>
<constructor-arg> //생성자 설정 (객체 데이터)
<list>
<value>수영</value>
<value>요리</value>
</list>
</constructor-arg>
<property name="height"> //setter() 설정 (property)
<value>187</value>
</property>
<property name="weight" value="84"/>
</bean>
- property, constructor-arg 태그를 줄여서 사용 하는 방법
<bean id="family" class="com.javalec.ex.Family" c:papaName="홍아빠" c:mamiName="홍엄마" p:sisterName="홍누나">
<property name="brotherName" value="홍오빠"/>
</bean>
[네임 스페이스]
c:papaName[java의 멤버 변수와 이름 동일] —>
p:sisterName ----->
위 처럼 간단하게 사용 하려면 xml 파일에 명시를 해줘야 한다.
xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
[다른 빈객체 설정]
<bean id="studentInfo1" class="com.javalec.ex.StudentInfo">
<property name="student">
<ref bean="student1"/>
</property>
</bean>
[스프링 컨테이너 생성, 스프링 설정 파일이 다수인 경우, 스프링 컨테이너에서 객체생성]
String configLocation1 = "classpath:applicationCTX.xml";
String configLocation2 = "classpath:applicationCTX1.xml";
AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation1, configLocation2);
Student student1 = ctx.getBean("student1", Student.class);
- Java를 이용한 DI 설정 방법
-Java 파일만 가지고 접근 할때는 어노테이션을 사용해야 한다.
- 클래스 이름 앞에 어노테이션을 붙여준다. 반드시
- 클래스 이름 앞에 어노테이션을 붙여준다. 반드시
@Configuration
spring 설정 파일로 사용할 예정이란 어노테이션
@Bean
Bean 객체를 만들어 주겠다는 의미
@ImportResource("classpath:applicationCTX.xml")
java file에 xml을 import 해올때 필요한 어노테이션
@Autowired
인젝션을 받기 위한 설정이다. 기본적으로 인젝션 할 수있는 클래스가 없으면 에러가 발생 할 수 있다.
※ 질문 :@Autowired와 @Resource 차이점을 모르겠다.
※ 질문 : DI의 장점으로 xml 파일로 객체를 생성해서 java class에 주입한다 라고 개념을 이해 했는데.
만약, 인젝션을 위한 인스턴스 설정인 @component를 붙일 경우의 예제를 알고 싶습니다.
xml 파일과 java 파일 같이 사용 하여 스프링 설정을 하고 컨테이너를 만들고 컴포넌트들을 생성 한다.
방법에는 2가지가 존재 한다.
- XML 파일에 JAVA 파일을 포함시켜 사용 하는 방법
- JAVA 파일에 XML 파일을 포함시켜 사용 하는 방법
7강. 생명주기 (life cycle)와 범위
- Spring 컨테이너 생명 주기
/*1. 스프링 컨테이너 생성*/
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
/*2.스프링 컨테이너 설정*/
ctx.load("classpath:applicationCTX.xml");
ctx.refresh();
/*3.스프링 컨테이너 사용 */
Student student = ctx.getBean("student", Student.class);
System.out.println("이름 :" + student.getName());
System.out.println("나이 :" + student.getAge());
/*4.스프링 컨테이너 종료*/
ctx.close();
- spring bean의 생명주기
implements InitializingBean, DisposableBean
InitializingBean
인터페이스를 상속 받으면, 자동으로 afterPropertiesSet()이라는 메소드를 오버라이드 하고, 빈 초기화 과정에서 호출 된다.
DisposableBean
인터페이스를 상속 받으면, 자동으로 destroy()라는 메소드를 상속 받는데, 빈 소멸 과정에서 생성 된다.
Bean은 xml 파일을 로드 할때 생성되는게 아니고, refresh 될때 생성이 된다.즉, bean이 초기화 될때
afterPropertiesSet() 메소드가 호출이 된다.
자원 해지, 컨테이너 해지시 소 close() 시 destroy() 메소드가 호출이 된다.
둘 중에 한가지만 상속 받아서 사용을 해도 무방하다.
어노테이션을 이용해서 사용 하는 방법
@PostConstruct
: 빈 초기화 시 호출
@PreDestroy
: 빈 소멸 시 호출
인터페이스 처럼 어떠한 오버라이드 메소드가 존재 하는게 아니라. 임의로 메소드를 만들고
그 위에 어노테이션을 붙여 주면 그 안의 메소드가 호출이 된다.
- 스프링 빈 범위 (scope)
스프링 컨테이너가 생성 되고, 스프링 빈이 생성될때, 생성된 스프링 빈은 Scope를 가지고 있다.
범위란 쉽게 생각해서 해당하는 객체가 어디까지 영향을 미치는지 경정하는 것이라고 보면 된다.
8강. 외부파일을 이용한 설정
- Environment 객체를 이용해서 스프링 빈 설정을 합니다.
environment 객체 안에 여러가지 정보들(config 설정값) 이 존재 하는데, 이런 설정값을 관리 하기 위해 environment 안에 property source 라고 하는 애들이 안에 위치 한다. 즉, 객체다. 각각의 정보들이 나열 되어 있다.
※ 질문 사항 : InitializingBean,DisposableBean 은 소멸자, 생성자 같은 개념인것 같은데. 어떠한 경우에 사용이 되는지
- Environment 객체를 사용 하지 않고 프로퍼티 파일을 직접 이용하여 스프링 빈을 설정하는 방법
-
Java 파일에서 어노테이션을 이용해서 설정 할 수 있다.
@Value
,@Bean
어노테이션을 이용한다. -
프로파일 속성을 이용한 설정 : 동일한 스프링 빈을 여러개 만들어 놓고 환경에 따라서 적절한 스프링 빈을 사용 할 수 있다. profile 속성을 사용 하면 된다.
약간 #ifedf #enddef 였다. 그게 생각 난다.
사용법은 1.xml을 이용하는 방법 , 2. java 파일을 이용하는 방법 두가지로 나뉜다.
이렇게 사용하는 이유는 개발 환경을 구분지어 셋팅 하고 싶기 때문이다.
예를 들자면, 개발환경에 따라 설정 값을 달리 줘야 할때, 꽤 많이 필요 할 것 같다.
9강. AOP (Aspect Oriented Programming)
[낱말 사전]
Aspect : 측면, 양상,관점
oriented : ~을 지향하는
AOP : 프로세스에서 어느 시점을 바라 보고 있는가에 의미 한다.
프로그래밍시 공통적인 기능이 많이 발생 하는데, 공통 기능을 모든 모듈에 적용하기 위한 방법으로 상속이 있다. 하지만, java에서는 다중 상속이 불가능 하고, 코드의 양이 많아 유지 보수하기 힘들다.
이러한 방법을 해결 하기 위해 AOP가 등장하게 되었다.
AOP 방법은 핵심 기능과 공통 기능을 분리 시켜 놓고 공통 기능 중에서 핵심 기능에 적용하고자 하는 부분에 적용 하는것을 의미 한다. 즉, 핵심 기능은 변할 수 있지만, 공통기능을 계속 재활용 하겠다는 의미 이다.
[AOP 용어]
Aspect : 공통 기능
Advise : Aspect 의 기능 자체
Jointpoint : Advice를 적용 해야 하는 부분
PointCut : Jointpoint의 부분으로 실제로 Advice가 적용된 부분
Weaving : Advice를 핵심기능에 적용하는 행위
관점 지향 : 핵심 코드를 바라보면서 언제 공통 기능이 언제 참고 될지 바라 보는것
※ 질문 :
- 프록시를 이용한 AOP 구현에서 프록시의 역할및 .. 무엇을 의미 하는지. 도통 감이 안잡힌다.
<aop:before> /*메소드 실행 전에 advice 실행*/
<aop:after-returning> /*정상적으로 메소드 실행 후에 advice 실행*/
<aop:after-throwing> /*메소드 실행중 exception 발생시 advice 실행*/
<aop:after> /*메소드 실행중 exception이 발생 하여도 advice 실행*/
<aop:around> /*메소드 실행 전/후 및 exception 발생시 advice 실행*/
10강. AOP (Aspect Oriented Programming)2
어떤 오브젝트가 원래 하지 않아도 될 로깅이나 트랜잭션등의 처리(다르게 말해, 공통화해서 라이브러리화 할 수 있는 처리)를 그 오브젝트에서 분리 해서 별도의 오브젝트로 구현하는 기술이다.
pointCut을 지정할때 사용하는 표현식으로 AspectJ 문법을 사용
- : 모든, . : 현재, .. : 0개 이상
Execution, within, bean
그래도 <dependency>
태그가 왜 붙는지 알것 같다. 그 이유는 공통 기능을 하나로 묶어주는 역할을 하기 때문이다.
11강. MVC 기초
Client 에서 web Browser를 통해 요청이 들어 오면, 가장 먼저 DispatcherServlet으로 들어 온다. DispatcherServlet으로 부터 HandlerMapping, HandlerAdapter, View(JSP), ViewResolver,Controller로 일을 처리 한다.
Spring MVC의 전체적인 구조
HomeController.java
모든 client의 요청을 DispatcherServlet으로 부터 받고 controller에게 넘기는데 이러한 역할을 하는 곳이 HomeController.java 파일 이다.Default 패키지로 만들어져 있다. 즉, Dispatcher에서 전달된 요청을 처리
view 폴더의 jsp 파일이 최종적으로 클라이언트에게 응답을 해줄 view 페이지가 있는 곳이다.
web.xml
servlet의 이름을 정해주고, 맵핑해주, 경로를 클래스에 보내는 역할을 해주는 설정을 해주는 곳이다. 즉, DispatcherServlet 맵핑, 스프링 설정 파일(servlet-context.xml) 위치 정의
servlet-context.xml
jsp와 관련 있는 객체(bean)을 설정 해준다. Controller, MultipartResolver(파일 업로드), Intercepter(로그인),URI와 관련 설정을 담는 클래스. WebApplication에서 Client의 요청을 받기 위한 설정, 스프링 컨테이너 설정 파일
root-context.xml
jsp와 관련 없는 bean객체를 설정, service, repository 비즈니스 로직을 위한 설정
DispatcherServlet
클라이언트 요청을 최초 받아 컨트롤러에게 전달
JSP를 찾는 과정
src 폴더 -> main -> webapp -> WEB-INF -> views -> ~.jsp
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
위의 코드가 의미 하는 바는 :/WEB-INF/views/ + 뷰이름 + .jsp :이렇게 해서 view 페이지가 나오게 되는 것이다. view 페이지의 경로를 설정 해줄 수 있다.
그렇다면? controller를 만들때 java 파일의 클래스에 @Controller
어노테이션을 붙여 주는 것만으로도 controller가 되는가? *그건 아니다.
/*com.javalec.ex 안을 스캔 하는 도중에 `@Controller` 어노테이션을 만나면, 그 class가 콘트롤러의 역할을 하게 된다. */
<context:component-scan base-package="com.javalec.ex" />
즉,com.javalec.ex 패키지 안에 있어야 하는 전제 조건이 있다.
이미지 경로 등...파일 경로
/*Dispatcher servlet에게 다음의 경로를 제외 시켜라!
resources 경로에서 다시 찾아라! */
<resources mapping="/resources/**" location="/resources/" />
만약에 리소스 파일 경로를 또 추가 하고 싶다면,
<resources mapping="/resources/**" location="/resources/" />
위의 태그를 추가해주고 파일 경로를 지정한다.
주로 다루게 될 부분
- Controller 부분
- view
controller scan은 servlet-context안의 component-scan에서 어노테이션이 적용되어 있는 자바 파일을 컨트롤러로 생각을 하고, 로직을 수행 하게 된다.
12강. 컨트롤러
컨트롤러 클래스 제작
최초 클라이언트로 부터 요청이 들어 왔을때, 컨트롤러로 진입하게 된다.
컨트롤러는 요청에 대한 작업을 한후 View쪽으로 데이터를 전달 합니다.
컨트롤러 클래스 제작 순서
@Controller
를 이용한 클래스 생성@RequestMapping
을 이용한 요청 경로 지정- 요청 처리 메소드 구현
- 뷰 이름 리턴
/*제대로 응답하게 하기 위한 메소드가 되게 하려면, RequestMapping을 해준다.
/view로 들어온것을 처리해 주겠다는 의미 */
@RequestMapping("/view")
매개변수로 Model이라는 파라미터를 받을 수 있는데, controller -> view쪽으로 데이터를 줄, 데이터를 가지고 있는 객체에 해당한다.
jsp에서 model에 담긴 데이터를 꺼내서 쓸 수 있다.
@RequestMapping("/contents/contentsView") /*요청 경로*/
public String contentView(Model model){
model.addAttribute("id","abcde 입니다.");
return "contents/contentsView"; /*뷰 페이지이름*/
}
뷰페이지 이름 생성(조합) 방법
뷰페이지 이름 = prefix + 요청 처리 메소드 변환값 + suffix
@RequestMapping
이 붙은 객체는 Model 객체를 파라미터로 받고 ,Model 객체에 데이터를 담는다.
처음에 요청이 Controller에게 오면, 컨트롤러가 Model에 데이터를 처리하고 view로 인해 응답을 해준다. 이때의 Model이 Model model에 해당 하는 model이다.
파라미터로 Model을 받지 않고, ModelAndView라는 클래스 타입의 객체를 생성 할 수 있다.
@RequestMapping("modelAndView/modelView")
public ModelAndView modelAndView(){
ModelAndView mv = new ModelAndView(); /*ModelAndView 객체 생성*/
mv.addObject("id","abcde"); /*Model 객체에 데이터를 담음*/
mv.setViewName("/modelAndView/modelView"); /*뷰이름 설정*/
return mv;
}
클래스에 @RequestMapping 적용
메서드에 @RequestMapping
어노테이션을 적용하여 요청 경로를 얻는다.
`@Controller`
@RequestMapping("/board") /*클래스에 @RequestMapping 적용 */
public class SampleRequestMapping {
@RequestMapping("/view1") /*메소드에 @RequestMapping 적용*/
public String view()
{
return "/board/view1"; /*조합된 요청 경로 */
}
// /board + /view = /board/view
}
13강. Form데이터
- HttpServletRequest 클래스
HttpServletRequest클래스를 이용해서 데이터를 전송하는 방법에 대해서 살펴 봅시다.
빠른 요청에 대응 하는 응답을 처리하는 것이 퍼포먼스가 좋은 프로그램이라고 할 수 있다.
- 데이터 커맨드 객체
데이터(커맨드) 객체를 이용하여 데이터가 많을 경우 간단하게 사용 할 수 있습니다.
기존의 다소 많은 코드량을 줄일 수 있다.
예를 들어 홈페이지 회원 가입을 한다 할때, 어마 어마한 데이터량이 넘어 오는데. 이럴때 RequestParam을 적으면, 매개변수 타입으로 엄청난 데이터량이 생긴다. 이렇게 양이 많고, 종류, 필드가 많으면, 코드량이 많고 보기 싫다.
데이터를 받는 param에 바로 받아서 view 페이지로 바로 넘기면 스프링 프레임 워크가 알아서 자동으로 멤버 필드에 set을 해주고 view 페이지로 간다.
[command 객체를 사용 하지 않았을때]
@RequestMapping("/member/join")
public String joinData(@RequestParam("name")String name,@RequestParam("id")String id,
@RequestParam("pw")String pw, @RequestParam("email")String email, Model model ){
Member member = new Member();
member.setName(name);
member.setId(id);
member.setPw(pw);
member.setEmail(email);
model.addAttribute("memberInfo", member);
return "/member/join";
}
[command 객체를 사용 했을때] 보다 시피 model 객체에 대한 언급도 없다.어짜피 model로 member에 넘길거
/*파라 미터에 바로 command 객체를 바로 담는다. model 없이 */
@RequestMapping("/member/join")
public String joinData(Member member){
return "member/join";
}
@PathVariable
어노테이션을 이용하면 경로(path)에 변수를 넣어 요청 메소드에서 파라미터로 이용 할 수 있다.
14강.RequestMapping 파라미터
RequestMapping 에서 Get방식과 Post 방식
Get 방식 : URL에 데이터를 실어서 보내는 것이고
/*Get 방식*/
@RequestMapping(method=RequestMethod.GET, value="/student")
public String goStudent(HttpServletRequest httpServletRequest,Model model){
System.out.println("RequestMathod.Get");
String id = httpServletRequest.getParameter("id");
System.out.println("id :" + id);
model.addAttribute("studentId" + id);
return "student/studentId";
}
Post방식 : 파일에 해더에 데이터를 실어서 보내는 방식
Form 데이터로 부터 값을 받을 때는 HttpServletRequest를 이용해서 값을 받아서 getParameter로 데이터의 id를 이용해서 데이터를 받을때의 방식을 일컫는다.
/*Post 방식*/
@RequestMapping(method = RequestMethod.POST, value="/student")
public ModelAndView goStudent(HttpServletRequest httpServletRequest){
System.out.println("RequestMethod.POST");
String id = httpServletRequest.getParameter("id");
ModelAndView mv = new ModelAndView();
mv.setViewName("student/studentId");
mv.addObject("studentId", id);
return mv;
}
@ModelAttribute
어노테이션을 이용하면 커멘드 객체의 이름을 개발자가 변경 할 수 있다.
@RequestMapping("/studentView")
public String studentView1(StudentInformation studentInformation){
return "/studentView";
}
@RequestMapping("/studentView")
public String studentView(@ModelAttribute("studentInfo") StudentInformation studentInformation){
return "studentView";
}
위의 두 코드의 차이점은 jsp에서 값을 가져 올때 studentView1의 메서드로 참조할땐,studentInformation으로 값을 참조 해야 하기때문에 굉장히 길어지지만, studentView의 메서드로 참조하면, studentInfo으로 값을 참조 해야 하기 때문에 짧아 진다.
- redirect 키워드
다른 페이지로 이동 할때 사용 한다.
특이 점은 풀 경로를 사용 할 수 있다.
@RequestMapping("/studentConfirm")
public String studentRedirect(HttpServletRequest httpServletRequest, Model model){
String id = httpServletRequest.getParameter("id");
if(id.equals("abc")){
return "redirect:studentOk";
}
return "redirect:studentNg";
}
15강. 폼 데이터 값 검증
- Validator를 이용한 검증 –> 인터페이스에 해당 된다.
폼에서 전달 되는 데이터를 커맨드 객체에 담아 컨트롤러 객체에 전달 할때 이때 커맨드 객체의 유효성 검사를 할 수 있는데. 참고로 javascript를 이용하는 것은 클라이언트에서 검사 하는 방법이고, 지금 Validator 인터페이스를 이용하는 방법은 서버에서 검사하는 방법이다.
16강. 트랜잭션
논리적 단위로 어떤 한 부분이 작업이 완료되었다 하더라도, 다른 부분의 작업이 완료되지 않을 경우 전체 취소되는 것입니다. 이때 작업 완료 되는 것을 commit 이라 하고 작업 취소 되는 것을 rollback 이라 합니다 .
이외의 책에서 발취
질문: 전반적인 구조의 흐름중에 티어와 레이어 처리가 어디서 일어나는지 잘 연결이 되지 않습니다.
그냥 개념을 나눠준것일 뿐이다. : 티어와 레이어
제네릭 : 클래스 내부에서 데이터 타입을 나중에 인스턴스를 생성 할때 확정하는 것 형변환의 번거로움이 줄어 듬, 타입의 안전성 제공,
ArrayList와 같은 컬랙션은 다양한 종류의 객체를 담을 수 있는데, 꺼낼때마다 타입의 체크와 형변환을 하는 것은 불편
이사님 강의
질문1 . java 파일에서 코드 변경시 컴파일을 다시 해야 하는데 , xml 에서 하면 컴파일이 필요 없고 코드만 로딩 하면 되기 때문이다.
프로그램 소스를 변경하지 않아도 되기때문에 xml 파일에서 객체를 생성해서 주입해준다.
제네릭 : 1.class, 2.method 선언해 줄때 ,3.파라미터 명시적으로 제한 , object로 제네릭 했을 경우, c++ 템플릿에 해당 , 형변환을 굳이 해주지 않아도 Templete으로 형을 만들었다가. 지워주고? 클래스 타입을 동적으로 만들어 준다. 장점 : 형 안전성, 컴파일 할때는 오류를 찾을 수 있게 해준다.
컬렉션 제네릭과 컬렉션의 차이점 : 제네릭을 여러개 쓴 집합에 관한 객체를 여러개 넣을 수 있는 , 여러개 모을 수 있는데 제네릭을 포함한.
- ArrayList ….
생성,소멸자의 개념이 아니라 bean 객체 생성 하기 전/후 에 미리 선작업이 필요한 경우 특정한 이벤트가 기다려지고 있을때 처리 하는 경우를 의미 한다.
log4g - eclipse 찾아보기
객체의 속성은 ref : 다른 객체를 injection 받아 사용하겠다. xml에서 메소드를 호출해서 설정
classpath:
시작 위치 확인 하는 법
alt + enter 에서 property 에서 Deployment Assembley ->classpath 확인이 가능하다.
환경 설정의 그 class path가 아니다.
*singleton : 객체를 1개 생성해서 요청해서 사용한다.
*필요 라이브러리를 임포트해준다.
*스프링에서 property의 name 이라고 하는건 method 명과 같다.
*인터페이스
file을 읽고, file에서 도시 명을 읽어 오고, 경로를 계산해주는 method 가 있을때, 수정 사항이 생겼을때,
인터페이스를 만들어 데이터를 정해 놓으면, 인터페이스에 맞게 구현하면, applicationcontext가
인테페이스만 잇으면 프로그램을 유연하게 할 수 있다. 동적으로.
- XML 안에 INCLUDE 시켜 준다.
JAVA 문법 EQUALS가 의미 하는것은 주소값을 비교해서 같냐 아니냐
서블릿 : 스레드 단위로 동작한다. 서블릿은 다른
controller는 singleton 단위로 동작 , 객체가 몇개 생기는지가 굉장히 중요하다.
initialize는 몇개 되는지 아는게 제일 중요 하다. —> InitializingBean 클래스 단위로 된다.
개별적으로 생성된다.
InitializingBean 객체 생성될때 마다 호출 된다.
기본적인 scope의 default는 singleton , prototype : bean을 새로 만들어 주는거에 해당 한다.
AOP : 로그 할때 많이 사용한다.
pointcut // method로 이해 하기
proxy : 함수 실행 순서만 정해 준다.
advice단위로 proxy에 적용해 준다.
getbean 시 객체 생성 되면서 값이 모두 설정 되었는데,
signature : 파라미터에 해당한다.
getBean 이 문자열과 map으로 이루어져 있어서 data와 key 값이 존재 한다.
Hibernate/JPA
- ORM 이란 무엇인가?
Object Relational Mapping
자바는 객체지향 언어인데 반해 설계는 테이블로 하는 현상
DB에 접근 하는 반복적이고, 병목적인 일을 줄이고, 최대한 비즈니스 로직에 집중