1. ModelAndView


페이지를 보여주기 위해서는

ModelAndView를 사용하여 보여줄 수 있다.


 

@Autowired
BoardService service;

//목록
@RequestMapping(value = "/list.do")
public ModelAndView list(){
        System.out.println("BoardControll 호출");
        service.list();
        System.out.println("BoardControll 종료");
       
        ModelAndView mv = new ModelAndView();
        mv.setViewName("list");
       
        return mv;
}

ModelAndView mv = new ModelAndView();

mv.setViewName("list");


<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
                <value>/WEB-INF/pages/</value>
        </property>
        <property name="suffix">
                <value>.jsp</value>
        </property>
</bean>

이상은 ViewResolver라고 하고,

사용자가 지정되지 않은 방법을 통하여 접속하는 것을 막는, 보안적 이점을 가져다주는 방식이다.

상기 방식을 통하여 jsp로는 접속을 할 수 없게 한다.

이는 dispatcher-servlet에서 실행된다.

 

 

ModelAndView model = new ModelAndView("welcome");
model.addObject("msg", "Hello Spring MVC + Log4j");
return model;

<h2>${msg}</h2>

welcome페이지와 연결된 ModelAndView model을 만들고

model에 msg라는 키값을 가진 "Hello Spring MVC + Log4j"의 값을 삽입한다.

그 후 model값을 return 하여 아래 <h2>를 이용하여 출력할 수 있도록 한다.

결과값은 <h2>형식으로

"Hello Spring MVC + Log4j"

가 출력된다.


2. 인터페이스

 

인터페이스 클래스 구현 방법

interface package

interface class

 

implements package

implements class

 

의 방식이다.




팁.

전부 선택한 상태에서 Ctrl + i를 통하여 모든 문서의 들여쓰기를 재조정해주는 기능이 있다.


Ctrl + Shift + F는 이클립스에 등록된 포맷에 맞춰 문서를 재조정해주는 기능이 있다.


Ctrl + 1은 이클립스의 에러 해결용 툴


추상 클래스(abstract) = 구체화된 작업 지시서


인터페이스(interface) = 타이틀만 있는 작업지시서(밑그림 레벨)


Ctrl + Alt + ↓는 아래로 한줄 복사하는 기능입니다.


Ctrl + t

를 이용해 현재 상속받은 interface와 현재 작업중인 class를 볼 수있다.

해당 방식을 이용해서 메서드 구현위치로 갈 수 있다.


Ctrl + Alt + H

를 이용해 해당 메서드를 호출하여 사용한 곳으로 갈 수 있다.


mysql에서 select * from 테이블

은 테이블 우클릭 후 select rows로 가능하다.


Spring-Module.xml

등 특정 파일명을 블럭으로 잡고

Ctrl + Shift + R을 통하여, 해당 파일을 바로 열 수 있다


Generics

타입 안정성과 타입 체크 및 형변환을 생략할 수 있기에 사용.

ArrayList<integer> ar = new ArrayList<integer>();

상기 예시에서 <integer>가 제네릭이다.


disconnect하되 2개 항목중 위의항목을 이용하여 서버와 연결을 끊고.

자신의 서버와 연결하는 것으로 다운받은 자료 백업 가능.













'JAVA > JAVA 기본' 카테고리의 다른 글

Portfolio 스프링 프레임워크  (0) 2017.10.13
Portfolio Maven  (0) 2017.10.13
Portfolio 서블릿  (0) 2017.10.12
Portfolio 기반 구성 및 사용  (0) 2017.10.12
JAVA 서블릿  (0) 2017.10.12

http://www.mvnrepository.com/

에서

org.springframework

​산하 코드를 이용할 것이다.


spring-jdbc
spring-core
spring-webmvc
spring-web
spring-context

를 이용할 것이며


4.1.6.RELEASE

버전을 사용한다.

 

javax.servlet의

javax.servlet-api 3.1.0또한 이용할 것이다.


web.xml은 서블릿 관련 설정을 담당하며, dispatcher-servlet.xml을 불러와 Spring의 설정을 담당할 수 있다.

web.xml과 서블릿명-dispatcher-servlet.xml은 같은 위치에 있어야 자동으로 불러올 수 있다.



<servlet>

        <servlet-name>board-dispatcher</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

</servlet>

형식으로 작성하면

web.xml과 같은 위치에서

board-dispatcher-servlet.xml

을 자동으로 찾아서 가져오는 기능이 있다.

<servlet-name>값에 -servlet.xml을 추가하여 자동으로 가져온다.



이하 <!-- --> 를 통해 각주처리된 부분은, 예전에는 저렇게 사용하여야만 servlet.xml을 가져올 수 있었다. 

<servlet>
        <servlet-name>hello-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--
        <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>WEB-INF/hello-dispatcher.xml</param-value>
        </init-param>
         -->
        <load-on-startup>1</load-on-startup>
</servlet>

 

<servlet-mapping>
        <servlet-name>hello-dispatcher</servlet-name>
        <url-pattern>*.do</url-pattern>
</servlet-mapping>

.do로 끝나면 Springdispatcher servlet으로 감.


dispatcher-servlet은

<context:component-scan base-package="com.shoon">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
을 통하여 각 클래스나 메소드의 @(annotation)을 검색하고, 이 검색된 부분에 각 기능별 beans를 부여해주는 기능을 가지고 있다.

이로써 클래스는 @Controller 등을 선언하는 것으로 bean을 불러오는것과 같은 기능을 사용할 수 있다.


@RequestMapping은

메소드 위에 들어가게 된다. 그 전문은 아래와 같다.

@RequestMapping(value = "/hello.do")

기본적으로

method = RequestMethod.GET

를 적었을 경우에는 GET방식만 받게 되므로 삭제하는 것을 추천함.

상기 기능을 포함한 리퀘스트매핑은 아래와 같다.

@RequestMapping(value = "/hello.do", method = RequestMethod.GET)


 

이하 스프링 프레임워크상의 기본적인 요청방식은 아래와 같다.

편의성을 위해 read.do를 이용한다.


1. 클라이언트가 원하는 기능을 선택함(read.do 주소값이 입력됨)


2. 해당 주소값을 받고 web.xml에서는

.do로 끝나는 url패턴이므로

<servlet-mapping>
        <servlet-name>hello-dispatcher</servlet-name>
        <url-pattern>*.do</url-pattern>
</servlet-mapping>

에 따라

<servlet>
        <servlet-name>hello-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
</servlet>

를 실행하여 servlet-class의 내용을 실행한다.

서블릿 클래스 springframework에 따라서

web.xml과 같은 위치에 있는 서블릿네임-servlet.xml을 실행하게 된다

 

3. hello-dispatcher-servlet.xml에서는

<context:component-scan base-package="com.mkyong" />

에 따라서

com.mkyoung에 있는 모든 @(annotation)을 검색한 후, 어노테이션에 해당하는 기능을 부여한다.

@Controller는 컨트롤러에 필요한 기능을

@Service에는 서비스에 필요한 기능을

@Repository에는 레포지토리에 필요한 기능을 부여해준다.

이 기능은 dispatcher-servlet의 beans에 기재되어 있다.

 

4. @Controller가 포함된 메서드 중

@RequestMapping(value = "/read.do")

가 선언된 메소드를 찾아 실행한다.

@Autowired

BoardService service;

@RequestMapping(value = "/read.do")
public ModelAndView read(){
        System.out.println("read 시작");
        service.read();
        System.out.println("read 종료");
       
        ModelAndView mv = new ModelAndView();
        mv.setViewName("read");
        return mv;
}

이후 Autowired된 BoardService service;에 따라

service.read();를 통해 5번으로 진행된다.


5. BoardService 인터페이스를 거쳐 BoardServiceImpl의 read메소드가 실행됨.

@Autowired
BoardDao dao;

@Override
public void read() {
        System.out.println("BoardServiceImp.list() 호출시작");
        dao.read();
        System.out.println("BoardServiceImp.list() 호출완료");
}

에 따라 dao.list();가 실행됨.


6. BoardDao 인터페이스를 거쳐 BoardDaoImpl의 list메소드가 실행됨.

@Repository

public class BoardDaoImpl implements BoardDao {

        @Override

        public void read() {

                // TODO Auto-generated method stub

                System.out.println("BoardDaoImp.read() 호출됨");

        }

}

까지 실행됨.

이로써 

Autowired는 Controller   -Autowired-   Service   -Autowired-   Repository(DAO)

가 성립함을 알 수 있다.



스프링 프레임워크상의 작업 순서도는

@Controller - @Service - @Repository순서로 진행된다.


@Controller는 service에 사용자로부터 받아들인 요청을 전달한다.

@Service로 정의된 클래스는, 스프링이 구동할 때 찾아서 해당 클래스의 interface를 읽어들인다.

해당 클래스와 interface는 메소드명과 반환형 등이 전부 같기에 가능하다.

@Repository는 DAO클래스에서 사용하며, service에서 넘어온 작업을 DB와 연동한다.



스프링의 가장 중요한 기능은

DI(의존관계주입)로써,

스프링에 자동으로 등록된 클래스(Controller, Service, Repository)는 실행시 자동으로 생성되고, 해당 기능을 당겨오는 것을 DI라고 한다.

@Autowired
BoardService service;

를 통하여 DI를 일으킬 수 있다.

BoardService는 인터페이스 클래스이다.


이하 Controller, Service, Repository에서 생성한 기능을 Autowired로 사용하는 방법이다.

Spring-파일명.xml

을 이용하여 등록 후 사용

생성

사용

<bean id="customerService" class="com.shoon.common.service.impl.CustomerServiceImpl">
        <property name="customerDao" ref="customerDao" />
</bean>

@Autowired를 이용하여 사용

@Autowired
CustomerService service;
<bean id="customerDao" class="com.shoon.common.dao.impl.CustomerDaoImpl">
        <property name="dataSource" ref="dataSource" />
</bean>

통상의 방법으로 사용

CustomerDao dao;

public void setCustomerDao(CustomerDao dao) {
        this.dao = dao;

}

bean을 @을 이용하여

Spring에 등록 후 사용

생성

사용

@Controller
public class CustomerController {
}

@Autowired를 이용하여 사용

@Autowired
BoardDao dao;

@Service
public class BoardServiceImpl implements BoardService {
}

통상의 방법 사용 불가능

단. bean id가 customerDao일때

통상의 방법으로 사용시 serCustomerDao의 식으로

앞에 set을 붙이고 카멜표기법으로 표기하여야 한다.



이하 내용은 스프링 2.x버전에서는 필히 사용하여야 하며,

4.x이상에서는 @controller / @service등을 이용하여 생략할 수 있다.

이하 방법을 '통상의 방법'으로 칭한다.

Datasource는 jdbc를 사용하기 위해서는 필히 등록해야 한다.

───────────────────────────────────────────────

 

resource폴더에

Spring_Module을 배치한다.

이후 resource폴더 내에 database와 beans폴더를 배치하고

database 에 Spring-Datasource.xml

beans 에 Spring-Beans.xml을 배치한다.

 

공통

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">

 

</beans>

이하의 내용은 상기 공통부분의 <beans>해당 부분</beans>에 입력된다.

 

Spring-Module

<import resource="database/Spring-Datasource.xml"/>
<import resource="beans/Spring-Beans.xml"/>

 

Spring-Datasource

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3307/sakila" />
        <property name="username" value="sakila" />
        <property name="password" value="sakila" />
</bean>

Spring-Beans

<bean id="customerDao" class="com.shoon.common.dao.impl.CustomerDaoImpl">
        <property name="dataSource" ref="dataSource" />
</bean>

<bean id="customerService" class="com.shoon.common.service.impl.CustomerServiceImpl">
        <property name="customerDao" ref="customerDao" />
</bean>

 

Spring-Module의 내용은

데이터베이스와 Beans의 파일을 연결시켜주는 값이기에, 폴더명/파일명의 식으로 데이터소스와 빈즈를 연동한다.

 

Spring-Datasource의 내용은

mysql과 연동시켜주는 값이기에

port값과 Schema명

계정명과 비밀번호를 변경하여야 한다.

상기 port값은 3307

상기 스키마명은 sakila

상기 계정명과 비밀번호는 sakila/sakila이다.

 

Spring-Beans의 내용은

Repository(첫번째 내용)는

dataSource라는 프로퍼티값을 부여하고, 해당 내용을 사용하게끔 하여

CustomerDaoImpl클래스가 DB와 연결되도록 한다.

이는 @Repository의 기능이다.

Service(두번째 내용)는

customerDao라는 프로퍼티값을 부여하고 해당 내용을 Autowired로 받아

customerServiceImpl클래스가 프로퍼티값인 customerDao와 연결되도록 한다.

이는 @Service의 기능이다.

 

덧붙여서 @Controller는 dispatcher-servlet에서 상기 연결기능을 담당한다.

그리고 Controller는 사용하지 않을 경우 해당 클래스 자체가 존재하지 않는다.

 

───────────────────────────────────────────────



RowMapper

는 스프링에서 지원하는 인터페이스이며,

rs(ResultSet)을 받아서 처리하여 주는 메소드이다.

public class BoardRowMapper implements RowMapper
{
        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                Board board = new Board();
                board.setNo(rs.getInt("no"));
                board.setName(rs.getString("NAME"));
                board.setPassword(rs.getString("password"));
                board.setTitle(rs.getString("title"));
                board.setContent(rs.getString("content"));
                board.setReadCnt(rs.getInt("read_cnt"));
                board.setCreateDate(rs.getTimestamp("create_date"));
                board.setUpdateDate(rs.getDate("update_date"));
                return board;
        }
}

 

 

new BeanPropertyRowMapper(Board.class));

상기 빈프로퍼티 로우매퍼는 DTO클래스를 받아서(상기 예시는 Board라는 DTO클래스를 사용함)

변수명을 받아 컬럼값을 찾음.

no일경우 no컬럼을 찾으며

readAll일 경우 read_all의 컬럼을 찾음.

public Board findByBoardId2(int no){
        String sql = "SELECT * FROM board WHERE no =  ?";
        Board board = (Board)getJdbcTemplate().queryForObject(
                        sql, new Object[] { no },
                        new BeanPropertyRowMapper(Board.class));
        return board;
}

 

 

 

 

Spring설정이 너무 길어지기에

servlet xml의 설정보다 많아져 가독성이나 주/부가 바뀌는 현상으로 인하여

Spring의 설정을 저장한 파일을 web.xml에서 불러올 수 있도록 묶어줌.

아래와 같은 방식으로 해당 설정파일을 불러올 수 있음.

web.xml의 display-name의 밑에 아래와 같이 사용한다.

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/**/Spring*.xml
        </param-value>
</context-param>

 

Spring-파일명.xml등록법 사용시 사용법

<bean id="아이디값c" class="패키지.클래스">

        <property name="프로퍼티명a" ref="레퍼런스값b" />

</bean>

일때

a라는 프로퍼티명을 가진 레퍼런스값b의 value를 아이디값c로 불러서 쓸 수 있다.

JdbcDaoSupport를 extends 하여 사용할 경우 datasource를 final로 선언하여 두었기에 사용자가 추가로 선언할 수 없으며, 선언할 필요도 없다.

 









'JAVA > JAVA 기본' 카테고리의 다른 글

portfolio 스프링 프레임워크 사용  (0) 2017.10.18
Portfolio Maven  (0) 2017.10.13
Portfolio 서블릿  (0) 2017.10.12
Portfolio 기반 구성 및 사용  (0) 2017.10.12
JAVA 서블릿  (0) 2017.10.12

maven플러그인

1. 라이브러리의 관리를위해 이용함

2. 웹 어플리케이션의 배포를 도움 

 

프로젝트 우클릭 - configure - conver to maven project

 

그룹 아이디 = 라이브러리를 관리할 이름

아티펙트 아이디 = 배포를 위해 참고할 이름

버전 - 버전을 기록하는 것. 실제 배포할때는 1.0.0이후로 사용하는것이 좋음

패키징 - war를 그대로 이용

 

라이브러리를 관리하기 위해서는 maven의 pom.xml에 들어가서 사용함.

http://www.mvnrepository.com/

에 들어가 원하는 라이브러리를 검색 후, 원하는 버전을 선택하고, Maven항목을 복사함.

이후 복사한 자료를 pom.xml에 붙여넣는 것으로 라이브러리가 추가됨.

Maven에서 ${}는 pom.xml에 상기된 properties를 참고함.

pom.xml을 수정한 프로젝트 우클릭 - Alt+F5

단. Alt+F5에 해당 프로젝트가 나오지 않는다면, Maven프로젝트가 아닌 것이므로,

프로젝트 우클릭 - configure - conver to maven project

를 실행한 후 다시 해볼 것.

상기 방식으로 maven을 이용하여 라이브러리를 받을 수 있다.

 

logger의 사용

final static Logger logger = Logger.getLogger(현재클래스명.class);

 

팁. Shift + Alt + X

로 프로그램 임시 구동창을 띄울 수 있으며

j를 눌러서 이클립스 내부 실행이 가능하다.

 

log4j.properties 사용법

# Root logger option
log4j.rootLogger=ERROR, stdout

 

# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

 

# Rirect log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\log4j-application.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

를 resources폴더에 넣고 참고하여 구동함.

아래의 두 단은 건드릴 일이 거의 없으며, 첫단 두줄의 경우 변경할 경우가 있음.

첫단

log4j.rootLogger=ERROR, 콘솔명

두번째 단

log4j.appender.콘솔명=org.apache.log4j.ConsoleAppender

의 방식으로 파일을 수정할 경우가 있음.

log4j.rootLogger=ERROR, stdout, file

이 될 시, 콘솔과 파일로 동시에 출력함.

stdout이 콘솔명이기에 콘솔에서 출력함.

rootLogger값을 ERROR로 하면 error와 fatal이 출력되고

rootLogger값을 INFO로 하면 info, warn, error, fatal이 전부 출력된다.

이 순서는

debug > info > warn > error > fatal

순으로 적용된다.

 

팁.

실제 서비스에서는 warning이나 error를 이용한다.

debug나 info는 너무 많은 로그를 남기기 때문이다.

 

단축키

Shift + Alt + R

클래스 내 해당 변수명을 동시에 전부 변경

Ctrl + Shift + R

프로젝트 내 해당 파일을 찾는 기능

Ctrl + PageUp

Ctrl + PageDown

이클립스 내 탭 간 이동 

Ctrl + W

파일 닫기

 

메이븐이 라이브러리를 자동으로 다운받는 위치

C:\Users\Administrator\.m2\repository

보통 관리자 목록으로 다운받아지게 됨.

업데이트 메이븐 이후에도 프로젝트가 진행되지 않을 경우

이클립스를 종료 후 repository를 통째로 지워버린 후 다시 업데이트 메이븐을 진행


'JAVA > JAVA 기본' 카테고리의 다른 글

portfolio 스프링 프레임워크 사용  (0) 2017.10.18
Portfolio 스프링 프레임워크  (0) 2017.10.13
Portfolio 서블릿  (0) 2017.10.12
Portfolio 기반 구성 및 사용  (0) 2017.10.12
JAVA 서블릿  (0) 2017.10.12

+ Recent posts