'개발공부/Spring'에 해당되는 글 13건

  1. 2019.08.18 [Spring] 03. VIEW 파일 추가.
  2. 2019.08.16 [Spring] 02. 컨트롤러 추가
  3. 2019.08.14 [Spring] 01. 프로젝트 생성
  4. 2015.12.25 [Spring] 06. Spring security 적용하기 (3)
  5. 2015.12.06 [Spring] 06. Spring security 적용하기 (2) 2
  6. 2015.11.14 [Spring] 06. Spring security 적용하기 (1)
  7. 2015.09.20 [Spring] 05. Spring + myBatis 설정
  8. 2015.09.13 [Spring] err-02. spring 한글 깨짐
  9. 2015.09.13 [Spring] err-01. @Autowired
  10. 2015.09.09 [Spring] 04. Spring + tiles 설정 28

[Spring] 03. VIEW 파일 추가.

개발공부/Spring 2019. 8. 18. 16:20

pom.xml 파일을 열어서 dependency를 추가.

		<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
		<dependency>
		    <groupId>javax.servlet</groupId>
		    <artifactId>jstl</artifactId>
		    <version>1.2</version><!--$NO-MVN-MAN-VER$-->
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper -->
		<dependency>
		    <groupId>org.apache.tomcat.embed</groupId>
		    <artifactId>tomcat-embed-jasper</artifactId>
		    <version>9.0.24</version><!--$NO-MVN-MAN-VER$-->
		</dependency>

google에 maven repository 검색 -> 사이트 내에서 검색하면 나옴.

 

프로젝트에서

main/resources/application.properties 파일 오픈.

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

추가.

 

webapp폴더 하위에 spring.mvc.view.prefix에 설정한 구조와 같도록 디렉터리 생성.

컨트롤러 파일 오픈후, 아래 내용 입력.

	@RequestMapping("/page")
	public ModelAndView page() {
		ModelAndView mv = new ModelAndView("tester");
		mv.addObject("text", "tester2");
		return mv;
	}

 

위에 spring.mvc.view.prefix 에서 설정한 디렉터리에 ModelAndView 에서 설정한 파일명으로 파일 추가.

ex) /WEB-INF/jsp/tester.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${text }
</body>
</html>

파일내용 입력.

mv.addObject("키", "데이터");

 

tester.jsp 에서 ${키} 하면 컨트롤러에서 셋팅된 데이터가 나옴.

 

 

 

 

:

[Spring] 02. 컨트롤러 추가

개발공부/Spring 2019. 8. 16. 10:39

새로운 컨트롤러 추가.

 

새로운 패키지 생성.

 

새로만든 패키지에 새로운 클래스 생성.

 

새로만든 클래스를 @Controller 어노테이션을 붙여서 컨트롤러로 등록.

클래스 안에 @RequestMapping("/hello") 를 추가하여 /hello로 접근시 아래 매소드가 실행되도록 적용.

 

http://localhost:8080/hello 접속.

화면이 나오지 않음... 왜그럴까.. 한참고민.

구글링 결과, 컴포넌트 스캔이 필요하다는것을 알게됨.

이전 글에서 DB관련 문제때문에 서버가 뜨지 않았을때, 어노테이션으로 처리하던 파일에 들어감. (*Application.java)

거기에 @ComponentScan("com.example")를 추가 후 저장.

다시 http://localhost:8080/hello 접속.

Hello Spring Boot World! 가 나오는것을 확인.

 

나는 프로젝트 생성시 시큐리티도 추가해서 시큐리티 관련 설정을 더 추가함...

관련 설정을 해주지 않을경우, /hello 접근시 시큐리티가 'ㅇㅇ 안돼 돌아가' 시전..

그래서 구글링해서 해당 설정을 추가 후 화면을 볼수있었음.

 

 

:

[Spring] 01. 프로젝트 생성

개발공부/Spring 2019. 8. 14. 00:13

완전 공부용으로 새로 시작!

 

이클립스 Project Explorer 우클릭 -> New -> Project... 선택

 

Spring Boot 폴더안에 Spring Starter Project 선택

 

기본적으로 입력이 되어있음.

입맛에 맞게 수정. Packaging만 War로 수정하였음.

 

Frequently Used는 최근에 선택했던 친구들.

원하는 기능들을 체크한 뒤에 Finish 클릭.

 

프로젝트 우클릭 -> Run As -> Spring Boot App 클릭 하면 프로젝트가 실행됨.

 

실행시 콘솔에 위와같은 내용이 나오고 서버가 제대로 뜨지 않을경우, DB관련 설정이 없어서 생기는 현상.

방법은 2가지 있음.

 

  1. 어노테이션을 추가하는 방법.
    1. 생성된 패키지 안에 *Application.java 파일을 연다. (스프링부트 메인 클래스)
    2. 해당 클래스 안에 @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) 을 추가한다.
  2. DB정보를 추가하는 방법.
    1. src -> main -> resources -> application.properties 파일 오픈.
    2. 아래 정보 본인의 DB에 맞게 수정하여 입력.
      spring.datasource.url=jdbc:mysql://localhost/databasename 
      spring.datasource.username=root
      spring.datasource.password=root
      spring.datasource.driver-class-name=com.mysql.jdbc.Driver


서버실행.

 

콘솔에 정보가 출력되면서 서버 올라감.

 

페이지 확인결과 서버 제대로 올라감. (스프링 시큐리티 추가해서 기본 로그인 페이지가 뜸.)

:

[Spring] 06. Spring security 적용하기 (3)

개발공부/Spring 2015. 12. 25. 21:04

제가 작성중에빼먹은 부분이 있었네요ㅠㅠ

다음 프로젝트 생성하고 셋팅하다가 발견했어요ㅠㅠ


<!-- 스프링 시큐리티 -->

<filter>

<filter-name>springSecurityFilterChain</filter-name>

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

</filter>

<filter-mapping>

<filter-name>springSecurityFilterChain</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>


이거를 web.xml에 추가해주시면 됩니다ㅠ

</web-app> 안에다가요ㅠ  

:

[Spring] 06. Spring security 적용하기 (2)

개발공부/Spring 2015. 12. 6. 15:46

음... 어... 이어쓴다그러고 한달이 지났네요..ㅠ 게을러서 죄송합니다ㅠ

주말되면 그렇게 쉬고싶더라구요ㅠㅠ

변명좀 하자면 운동도 좀 하고 그러면 그냥 쉬고싶어서..ㅠㅠ

바로 시작하겠습니다ㅠ


이전내용 : http://comtk.tistory.com/20


2. 시큐리티 파일 생성


잠시 이전에 올려두었던 'security-context.xml'을 보고가겠습니다.





오늘은 여기서 이 있는 파일들만 설명드리겠습니다.

이전글에 전체 파일들에 들이 막 찍혀있는건 그파일들을 손댔다는뜻인데, http://comtk.tistory.com/10 이 글에 있는 내용의 작업들을 한겁니다. DB가서 데이터 가져오는 작업을 한것이죠. 어떤작업을 한것인지는 설명드리겠습니다.



2-1. CustomizeUserDetailsService


위 이미지에서 맨 아래부분을 확대해보겠습니다.


위 이미지를 보시면 'authentication-provider' 를 보시면 'customizeUserDetailsService라고 되어있습니다.

권한에 대한 처리를 'customizeUserDetailsService'에서 제공받는다는 의미로 생각됩니다.


첫번째 을 보시면 'loginAction 구현' 이라는 주석이 달려있습니다.

저 클래스에서 권한과 로그인에 대한 부분을 같이 처리하고있습니다.


해당 클래스의 내용을 확인해보겠습니다.




위에서부터 차근차근 설명해보겠습니다.

이 클래스는 'UserDetailsService'를 상속받아서 만들어야 합니다.

네 그래야만 해요. 그래야지 저대로 쓸수있어요. 따로 설정을 해주지않으면 스프링은 저 클래스를 사용해서 권한 및 로그인에 대한 처리를 한다고 알고있습니다. 그래서 클래스를 상속받아서 메소드를 입맞에 맛게 오버라이딩 한 후에 사용해야 합니다.


그 다음으로 변수들을 보겠습니다.


이 변수들은 사실 꼭 필요한것은 아니지만.. 잠시후에 계정의 권한을 위해서 만들어둔 변수들입니다.

위에서부터 하나씩 설명하지면 '사용 가능한지', '계정이 만료되지 않았는지', '자격이 만료되지 않았는지', '계정이 잠기지 않았는지' 체크하는 변수들입니다.


그 다음줄은 사용자가 입력한 계정명으로 해당 계정을 찾아서 가져옵니다.

그 아랫줄에서는 그 계정에 대한 상태를 가져와서 if문에서 하나하나 비교해서 상태에 맞게 계정정보를 설정해줍니다.


다음줄로 넘어가겠습니다.



저는 권한을 DB에 저장하여 사용하고있습니다.

DB에서 권한목록을 가져와서 권한을 추가해줍니다. 위 이미지에서 가지고있는 권한중에 'Anonymous'가 있을경우, 권한목록을 따로 생성하지않는것을 볼 수 있습니다. 이는 위 내용은 손님이 아닌 그 이상의 권한을 가진 사람들에 대한 권한처리를 위해 작성된 것임을 알려드립니다. 각 프로젝트의 특성에 맞게 권한을 부여해주시는것이 바람직합니다.


이제 설정한 권한 및 계정상태를 member에 담아서 리턴해줍니다.


이 과정이 끝나면 로그인이 되거나, 로그인에 실패하거나 둘중 하나의 상황을 맞이하게 됩니다.


먼저 성공했을때의 상황을 보겠습니다.



2-2. CustomizeAuthenticationSuccessHandler


맨 위 이미지에서 두번째 에 해당하는 클래스입니다.

로그인이 성공했을 경우를 보여줍니다.



이 클래스 역시 다른 클래스를 상속받아서 사용합니다.

저는 로그에 '성공' 이라는 텍스트를 찍고 메인페이지로 이동하도록 작업했습니다.



2-3. CustomizeAuthenticationFailureHandler


맨 위 이미지에서 세번째 에 해당하는 클래스입니다.

로그인이 살패했을 경우를 보여줍니다.


이 클래스 역시 다른 클래스를 상속받아서 사용합니다.

저는 로그에 '실패' 라는 텍스트를 찍고, 어떤이유로 로그인에 실패했는지 로그를 남깁니다.

이후 페이지는 다시 로그인페이지로 이동합니다.


2-4. encoder


이부분은 따로 파일을 만들지 않고 기본 스프링 인코더를 사용했습니다.

그러나, 따로 암호화 모듈을 사용하여 사용하셔도 됩니다.


'class'부분을 수정하여 사용하시면 됩니다.



3. 부가적인 설정


자 이제, 로그인 및 계정에 대한 권한설정 부분을 하였습니다.

그럼 이제 권한을 사용하여야 하는데... 어떻게 사용할까요...

손님이 접근가능한 부분과, 관리자가 접근가능한부분등 각 권한에 따라 접근 및 행동에 제약이 있어야지, 그렇지않으면 권한이 의미가 없습니다.




을 보시면 '@secured("ROLE_USER")'가 보이실겁니다.

이 한줄로 사용자의 접근을 통제할 수 있습니다.

위 이미지처럼 메소드 위에 써놓으면 해당 메소드는 저 권한이 있는 사용자만 접근이 가능하게 됩니다.

그러나, 메서드별로 해놓으경우 각 메소드마다 다 써줘야하는 번거로움이 있습니다.

class 위에 적어놓으시면 클래스 내의 모든 메소드는 선언되어있는 권한이 있는 사용자만 접근 가능합니다.

그렇기때문에 권한 및 기능별로 클래스를 잘 나누어 사용하는것이 좋습니다.

그럼 한줄만 추가 및 수정하는것으로 사용자의 접근을 통제 가능하게 됩니다.


이외에도 여러가지 설정이 더 있겠지만, 이정도면 기본적인 로그인 및 권한, 접근제어등에 대해서 사용이 가능하다고 생각됩니다. 혹시 내용중에 틀린부분이 있다면 지적해주시면 감사하겠습니다. 그래야 저도 더 공부가 되니까요!!


다음번엔 무엇을 해볼까요.. 뭔가 더 있을텐데... 아참 스프링 4.0이 나왔다는데 그것도 날잡아서 시작해봐야겠어요!!

다른 카테고리도 글을 써야하는데 참... 할게많네요ㅠ 어 어떻게 마무리를 하지.. 음.. 다음에 또 봐요!!

































:

[Spring] 06. Spring security 적용하기 (1)

개발공부/Spring 2015. 11. 14. 20:12

안녕하세요~ 오랜만에 'spring' 에 포스팅하는거같네요ㅠㅠ

사실 제가 시큐리티하다가 멘탈이 깨져서... 거의 못했었어요ㅠㅠ

뭐 다른일도 있긴했는데 그건 다 핑계고 메인은 시큐리티하면서 로그인만드는데 안되서 멘탈나갔지요ㅠㅠ

오랜만에 쓰는데 잘 정리할 수 있을지 모르겠습니다...

일단 시작해볼께요!!


1. 설정


1-1. 파일구조


빨간 점이 찍혀있는 파일 및 폴더는 이번에 설정하면서 수정 혹은 생성되는 파일들입니다.

이전거에 비해서 엄청나게 이미지가 길어졌어요...ㅠㅠ


1-2. security-context.xml


먼저 새로운 파일을 하나 만들꺼에요.

'security-context.xml'을 만들어줍니다.



잘 안보이시죠..ㅠ 눌러서 보세요ㅠㅠ

이거 내용이 짱짱많아요...ㅠㅠ 이거 언제 다하지... 하.. 얄개님이 그림그릴때 이런느낌이었을까ㅠㅠ

얄개님을 안다면 당신은 픽플! ㅋㅋㅋ 정신빠진소리나 하고 않아있지만 이해좀 해주세요.. 이거 어케정리해야할지 막막함 ㅋㅋ


1-2-1. http


자 일단 http 안에 내용들을 설명해볼께요.

이걸 주석안달고 굳이 설명하는 이유는 내가 공부하기위함입니다. ㅋㅋ

많으니까 좀 간략히 설명할께요.


auto-config : 저거를 ture로 하면 아무것도 가장 기본적인 로그인페이지가 생성됩니다. 저는 따로 페이지를 만들었기때문에 false로 했는데 true로 하고 만들어도 상관없어요. 원래는 권한부여에 대한 설정을 하는곳인데 true로 해두시면 그 설정을 기본설정으로 자동으로 설정하겠다는 뜻이 됩니다.


use-expressions : 이건 말로 설명하기가 좀 애매해서 링크를 첨부합니다. http://cafe.daum.net/_c21_/bbs_search_read?grpid=1DpW4&fldid=Pgo7&datanum=1


create-session : 이 값을 never로 셋팅한 경우, 사용자는 권한이 필요한 페이지로 접근시 로그인페이지로 리다이렉트되면서, 로그인하기 전까지 세션아이디가 생성되지 않는다고 합니다. 다른 여러가지 값들이 있읉터인데 찾아보지 않았어요. 필요하신분은 직접 구글링해보시는게 좋을거같습니다.


disable-url-rewriting : url에 jsessionid가 붙는것을 방지해준다.



1-2-2. intercept-url


url 패턴에 대한 설정이 가능합니다.


pattern : 요청을 중간에 가로챌수있는데, 그 가로챙 요정에 대한 패턴을 정의해줍니다. 해당패턴에 일치하면 가로채서 그에맞는 권한을 갖고있는 사용자만 접근 가능하게 할 수 있습니다.


access : 사용자가 접근할 수 있는 권한을 설정합니다. 저는 로그인페이지만 지정해서 모든사용자가 접근 가능하도록 permitAll로 설정하였습니다. 이 역시 다른값들이 많은데, 그에대한건 직접 구글링을 해보시기 바랍니다.



1-2-3. form-login


login form 및 login 자체에 대한 여러가지 설정을 할 수있습니다.


login-page : 로그인 페이지의 url을 설정합니다.


username-parameter : 사용자 계정명을 어떤 파라미터명으로 받을지 설정합니다. 이부분은 나중에 form안에 input 테그의 사용자 계정명을 입력하는부분의 name과 동일해야합니다.


password-parameter : 사용자 계정에 대한 패스워드를 어떤 파라미터명으로 받을지 설정합니다. 이부분 역시 나중에 form안에 input 테그의 패스워드를 입력하는부분의 name과 동일해야합니다.


login-processing-url : 로그인을 처리하는 url입니다.


authentication-success-handler-ref : 로그인 성공시 해당 클래스로 이동하여 성공시에대한 처리를 따로 할 수 있습니다.


authentication-failure-handler-ref : 로그ㅇ니 실패시 해당 클래스로 이동하여 실패시에대한 처리를 따로 할 수 있습니다. (로그남기기, 해당 계정명의 로그인 실패횟수 올리기 등등..)



1-2-4. logout


logout을 할경우 그에대한 설정을 할 수 있는 부분입니다.


invalidate-session : 세션을 삭제할건지 설정합니다.


logout-url : 로그아웃을 실행할 url을 설정합니다. 내용은 따로 구현하지 않아도 무방합니다.


logout-success-url : 로그아웃 성공시 리다이렉트되는 url을 설정합니다.


delete-cookies : jsessionid, remember-me 등 로그인에 관련된 쿠키 및 세션을 삭제합니다.



1-2-5. remember-me


remember-me는 자동로그인에 대한 내용입니다.


token-validity-seconds : 해당 세션을 얼마나 유지할지 설정합니다. 따로 로그아웃하지 않는이상 브라우저를 완전히 닫은뒤에 접근하여도 자동으로 로그인됩니다.


key : 이건 제가 좀 더 알아봐야할거같습니다. 시큐리티도 방금완성한마당에..




1-2-5. authentication-manager


로그인을 어떻게 처리할지에 대해 설정합니다.


authentication-provider에서 설정한 user-service-ref의 id를가진 클래스로 접근하여 로그인을 처리합니다.

로그인을 처리할때 password-encoder에 설정된 encoder를 이용하여 사용자가 입력한 패스워드를 암호화하여 비교하고, 해당 계정에 맞는 패스워드인지 확인합니다.




 1-3. web,xml




web.xml에 스프링 시큐리티를 설정한 파일을 추가해줍니다.


자 이렇게 설정파일은 전부 설정했습니다.

이제 내용만 채우면되는데... 그게 참 쉽지않네요ㅠㅠ

내용채우는 부분은 제가 좀 더 정리한 후에 하는게 나을거같아서 급하게 설정파일만 설정해놓고 마무리합니다.ㅠㅠ

이거한다고 돌아가진않아요ㅠㅠ 왜나면 이건 커스터마이징한상태를 올리는거라 저기서 <beans:bean>의 클래스드를 생성하여 안에 내용을 채워줘야합니다.


기본적인 내용 및 제가 구글링하시라고 했던 내용들은 아래 링크를 걸어둔 블로그에서 확인해보시면 편하실실겁니다!!


가장 기본적인 시큐리티 부분을 하시려한다면 안에 security_context.xml 안에 내용을 다 지우시고, 


<?xml version="1.0" encoding="UTF-8"?>

<beans:beans 

xmlns="http://www.springframework.org/schema/security" 

xmlns:beans="http://www.springframework.org/schema/beans" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

           http://www.springframework.org/schema/security

           http://www.springframework.org/schema/security/spring-security.xsd">



<http auto-config="true"  use-expressions="true">

<intercept-url pattern="/-" access="permitAll" />
</http>

<authentication-manager>
<authentication-provider>
<user-service>
<user name="guest" password="guest" authorities="ROLE_USER"/>
</user-service>
</authentication-provider>
</authentication-manager>


</beans:beans>

이것만 입력하신다음에 해보시면 기본 로그인페이지를 확인하실수 있습니다.

'프로젝트명/spring_security_login' 여기로 접근하시면 됩니다.


나머지내용은 얼른 정리해서 조만간 포스팅하겠습니다!!

다음에 또 뵈요!!






:

[Spring] 05. Spring + myBatis 설정

개발공부/Spring 2015. 9. 20. 18:08

안녕하세요~ 오늘은 이전시간에 말했던것처럼 myBatis를 해볼까합니다.

지금 인터넷찾아보고 설정하면서 실시간으로 작성하는중인데

과연 오늘안으로 할수있을지 걱정입니다..ㅋㅋ


저번주(2015-09-13)에 여기까지 작성하고 내가 이걸 해도되나 생각좀 해보다가 오늘(2015-09-20)에서야 올려요ㅠ

아무래도 보고나서 하는거다보니 좀 캥겼나봐요ㅠ


이제 진짜 시작하겠습니다!!



1. 설정


1-1. 파일구조



빨간 점이 찍혀있는 파일 및 폴더는 이번에 설정하면서 수정 혹은 생성되는 파일들입니다.


1-2. pom.xml


일단 pom.xml에 아래와 같은 dependency를 추가해줍니다.


저는 mysql로 작업중이라서 mysql을 추가했는데, 각자 사용하시는 DBMS에 맞게 추가해주세요!!


1-3. root-context,xml


다음으로는 root-context,xml입니다.


자 위에서부터 설명을 좀 해보면, db properties부분은 db의 정보를 설정하는 부분인데, 저는 다른곳에 properties파일을 만들어서 따로 저장해두었습니다. 그래서 거기서 정보를 읽어오는데, 그에대한 설정은 <bean>안에 <property>에서 파일위치를 알려줘서 거기서 가져오도록 하였습니다. 이부분을 해주지 않으면 아래 dataSource 설정할때 위 소스처럼 사용이 불가능합니다. 해주지 않으면 ${..} 대신에 정보를 직접 입력하셔도 됩니다.


db.properties 내용입니다.



위에서 '=' 왼쪽부분이 id처럼 사용됩니다.


자 그아래 dataSource부분!! 위에 properties에서 읽어온 정보를 적용시켜주면서 DB의 정보를 설정해주는 부분이에요. 위 소스보다 dataSource가 더 중요한부분입니다. 각자 자신이 사용하는 DBMS에 맞는 드라이버와 URL 및 계정정보를 입력해주시면 됩니다. 해당 빈에 id를 추가해주세요. 이 id는 그 아래 설정에서 사용하게 됩니다.

DB에 대한 정보를 계속 입력하지 않고, 한번 설정한 다음에 id를 부여해서 해당 id를 찾아가서 설정된 속성들을 가져오기때문에, 이부분(id)은 괜히 오타내지 마시고 복붙하시는게 좋다고 생각됩니다.


다음으로 transactionManager 입니다.

이름만 들어도 트랜잭션 관리를 하는 녀석인데.. DB에 대한 정보를 필요로하는것같습니다.

위에서 설정해준 id를 ref부분에 입력해주시면 됩니다.


그다음 sqlSessionFactory 입니다.

dataSource부분은 넘어가겠습니다.

그 아래 보시면 configLocation이 있습니다. 이름만봐도 알수있는 설정파일 위치입니다.

저기서 자주쓰는 자료형같은것들을 미리 설정해주면 나중에 parameter나 result를 념겨주고 가져오는데 좋습니다.


mybatis-config.xml 파일을 보겠습니다.



자 왼쪽에 type에 보면 java.부터 해서 마지막까지 주르륵 쓰여있습니다.

오른쪽에는 alias라고해서 짧게 정의되어있어요. 

이게 무슨말이냐 하면, alias를 작성해면 alias에 해당하는 type을 사용한다는 의미입니다.

값을 주고받을때 원래는 type에 있는 내용을 다 작성해야하는데 언제 java.부터 치고있어요ㅠ


다음은 mapperLocations 입니다.

실제도 돌리는 sql파일들을 말하는겁니다.

저같은 경우는 해당 패키지 안에있는 xml파일들 전체를 설정하였습니다.


마지막으로, typeAliasesPackage 입니다.

value를 보시면 vo가 들어있는 패키지로 설정되어있습니다.

이게 뭔지 말씀드리자면, 한마디로 설정한패키지 안에있는 (vo패키지 안에있는) 파일들에 대해서 configLocation 에서 설정한것처럼 alias를 부여해주겠다는 의미입니다.

그런데 보시면 따로 alias에 대한 이름은 없습니다. 저 패키지안에 뭐가 얼마나 들어갈지 모르는데 그걸 어떻게 미리 alias를 지정할수있을까요ㅠ 그럼 어떻게하느냐? 해당 class파일명으로 alias가 됩니다.

mybatis-config.xml <typeAlias> 내용을 생각하시면 이해가 빠릅니다.

그냥 딱 저것처름 된다는거라서,, 뭐라고 더 설명할게 없어요ㅠ


마지막은 sqlSession인데...

sqlSessionFactory 의 정보를 갖고 세션관리를 한다고만 알고있습니다... 정확히는 저도 더 공부를 해봐야해요ㅠ



1-4. servlet-context,xml


위에 root-context 하다가 시간을 다보냈어요..ㅠ 이렇게 오래걸릴줄이야ㅠ

역시 아는거랑 설명하는거랑은 차이가 크네요ㅠ

다음 보겠습니다ㅠ!



바로 이야기해볼께요.

처음 component-scan 부분에 보시면 base-package가 보입니다.

해당 패키지안에 있는 class파일들을 스캔하여 bean으로 등록해줍니다.

모든파일을 등록하는것이 아니라, '@Controller''@Component'등의 어노테이션이 붙은 친구에 한해서 말이죠.


annotation-driven transaction-manager

1-3에서 설정한 transactionManager를 기반으로 트랜잭션을 관리해주는것이라고 생각됩니다.

이부분은 계속 찾아보면서 공부하고있는데 아직 확립이 잘 안돼요..ㅠ


2. 구현


2-1. controller


자 이제 실직적인 구현부분입니다.

controller 먼저 보겠습니다.



빨간점 부분만 보시면됩니다.

나머지는 이전시간에 하던작업이랑 다른게 없어요.


이렇게 service를 등록해줍니다.

하지만 따라하시는분들은 service가 없을꺼에요.

괜찮아요 이제 만들꺼니까 ㅋㅋ



2-2. service



이렇게 인터페이스를 만들어줍시다.

여기에 인터페이스를 만들고 구현은 좀 뒤에 하겠습니다.


2-3. mapper



이렇게 mapper를 작성해줍니다.

역시 빨간점부분을 신경써서 보세요.


2-4. serviceImp





자, servicemapper를 모두 만들고 난 후에 실제 구현을 해보겠습니다.

역시 빨.간.점!! 신경써서 보세요.

저는 처음에 할때 몇부분 빼먹어서 안된다고 징징대다가 혼나적이 한두번이 아닙니다....ㅠㅠ


service로 등록해주시고, 트랜잭션 처리를 위해 '@Transactional'을 적어줍니다.

'@Transactional'은 method 단위로도 사용 가능합니다.

그다음에 아까만든 service를 구현합니다.

구현하면서 DB에 접근할때 mapper를 사용하여 접근합니다.


그런데 DB에 접근해서 주고받고 한다고 하는데.. 저희는 sql을 작성한적이 없어요.

어디서할까요??



2-5. sql




자 여기가 제일 중요한거같은데요.. 위에서 막 설정하고 그런거 여기 다나와요ㅠ


설명은 빨.간.점 기준으로 하겠습니다.


맨먼저 '<mapper>'를 보겠습니다.

'namespace'를 보시면 특정 mapper를 지정하였습니다.

저 mapper는 아까 인터페이스로 만든 mapper입니다.

위에서 만든 mapper에서 메소드명이 sql파일에서 id가 됩니다.

'<insert>'안에 'id' 보이시나요? 위로 올려서 mapper부분 보시면 메소드명이랑 일치합니다.

둘이 일치하지않으면 에러나요ㅠ 꼭 일치시켜 주세요ㅠ


다음으로 보시면 'parameterType'이 보입니다. 저부분이 아까 1-3. root-content.xml에서 sqlSessionFactory의 typeAliasesPackage를 설정해서 저렇게 간단히 사용가능한겁니다. 만약 그렇게 안했으면, com.contk.vo.HallCommentVO' 이걸 전부 입력했어야 합니다. 패키지명까지 전부 말이죠.


그 다음으로 3번째 'resultType''Integer' 보이시나요? 이건 1-3. root-content.xml에서 sqlSessionFactory configLocation을 설정해논 덕분에 'Integer' 로 사용이 가능한겁니다.


자 마지막입니다.

'${id}' 보이시나요?? 저건 'HallSeatGradeVO' 안에있는 변수명입니다.

'serviceImp'에서 로직을 구현하면서 설정한 값이 들어갑니다. 자료형에 맞에 알아서 들어가니까 저렇게 써주시면 됩니다. 숫자일경우 ''없이 알아서 들어갑니다.




혼자 대충이해하고 말때는 금방인데 설명하려니 정말 다르네요.

크게 신경안쓰던것도 신경쓰면서 공부하게되고... 블로그 하길 잘한거같아요.

설명은 1차적으로 잘까먹는 저를위해 하는것도 있어요ㅠㅠ


다음번에는 스프링 시큐리티를 해볼까요!!

사실 지금까지 작성한건 이전에도 대충이라도 한두번 해봤던거라서 좀 나았는데 시큐리티 잘 할수있을지 ㅋㅋ

뭐 구글링을 잘 하면 되겠죠 ㅋㅋ 보시면서 도움이 되는지 모르겠네요 지극히 주관적으로 이해하고 그대로 작성하다보니... 틀린부분은 알려주시면 감사하겠습니다.


그럼 이만적고, 다음에 봐요!!






:

[Spring] err-02. spring 한글 깨짐

개발공부/Spring 2015. 9. 13. 19:27

설정을 끝내고 이제 form으로 입력테스트를 하는중에, 한글데이터가 깨지는 현상이 발견됐다.

어씨? 뭐지 하면서 잠깐 고민했는데, 아까 '@Autowired' 에러났을때 'web.xml'에서 한글관련 필터를 본게 생각나서 얼른가서 긁어서 적용했다.


<filter>

<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>


역시나 추가하니까 바로 한글 잘 넘어간다. 형꺼보고 배우는게 많다...

내 블로그 알려줬는데 보겠지.. 얼른 다른거 써야 이런거 못보는데..

나중에 오라클 인덱스관련해서 설명해놓은거 허락받고 가져올생각중이다.

:

[Spring] err-01. @Autowired

개발공부/Spring 2015. 9. 13. 18:41

ERROR: org.springframework.web.servlet.DispatcherServlet - Context initialization failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hallController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.comtk.service.HallService com.comtk.controller.HallController.hallService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hallServiceImp': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.comtk.mapper.HallMapper com.comtk.imp.HallServiceImp.hallMapper; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.comtk.mapper.HallMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)

at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)

at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)

at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)

at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)

at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651)

at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599)

at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665)

at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518)

at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459)

at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)

at javax.servlet.GenericServlet.init(GenericServlet.java:158)

at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1231)

at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)

at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1031)

at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4914)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5201)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)

at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:586)

at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1750)

at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)

at java.util.concurrent.FutureTask.run(Unknown Source)

at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

at java.lang.Thread.run(Unknown Source)

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.comtk.service.HallService com.comtk.controller.HallController.hallService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hallServiceImp': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.comtk.mapper.HallMapper com.comtk.imp.HallServiceImp.hallMapper; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.comtk.mapper.HallMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)

at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)

... 33 more

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hallServiceImp': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.comtk.mapper.HallMapper com.comtk.imp.HallServiceImp.hallMapper; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.comtk.mapper.HallMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)

at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)

at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)

at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:910)

at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:853)

at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768)

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)

... 35 more

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.comtk.mapper.HallMapper com.comtk.imp.HallServiceImp.hallMapper; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.comtk.mapper.HallMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)

at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)

... 46 more

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.comtk.mapper.HallMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:986)

at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:856)

at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768)

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)

... 48 more



이런 에러가 났다.

넋두리에서 적은것처럼 난 복붙을 하면서 작업했다.

뭐가문제일까 잘 보는데 도대체 알수가 없었다.

hallcontroller와 hallmapper가 보여서 계속 찾아봤으나 알수가없었다.

구글링을 2시간정도 하면서 할려주는대로 다 해봤는데 안됐다...

다시 하나씩 뜯어보던중에.... mapperscanner에서 value를 잘못썼다... 사실 잘 썼는데, 프로젝트랑 패키지명이 맘에안들어서 막 바꾸고나서 저걸 안바꿔줬더니 이런 에러가 났다.

이글 작성하면서 자세히 보니 맨 위에 'Context initialization failed' 이게 바로보이네..

그래도 이거잡으면서 이것저것 잘못설정해놓은 것들을 다 잡았다. 나중에 아마 또 이럴거같으니 적어놔야지.

:

[Spring] 04. Spring + tiles 설정

개발공부/Spring 2015. 9. 9. 00:17

안녕하세요! 1주일만에 작성하는거같네요ㅠ

게을터러져서 참... 이러면 안돼는데 왜이럴까..ㅠ

헛소리 그만하고 바로 시작하겠습니다ㅠ!


1. tiles란?

 

화면을 구성하는데 있어서 하나의 파일이 아닌 여러부분을 따로 작업해서 하나로 묶어 화면에 보여주는것을 말합니다.

예를들어서 한 화면에 레이아웃이 header, content, footer로 구성되어 있으면 각 부분을 파일로 만들어서 여러 페이지에서 내용만 바꿔가면서 모든페이지에 header와 footer를 보여주는것이 가능합니다.

물론 하나의 파일에 전부 때려박아도 가능은하지만.. 뭔가 수정할때 페이지수만큼 수정이 필요합니다.

 

JSP에는 이미 include 기능이 있는데 굳이 tiles를 쓰는 이유가 있을까요?

저도 tiles를 전부 이해한게 아니라서 뭐라 설명은 못드리는데... 일단 include보다 편합니다.

그대신 사용하기전에 설정이 필요해요. 레이아웃 요소들부터 레이아웃의 틀까지 만들어줘야합니다.

 

편리함으로 예시를 하나 들어보면, 만약에 페이지수가 50장정도 되는 웹사이트가 있다고 가정합니다.

이 웹사이트의 header부분에 수정이 필요해서 header에 해당하는 jsp파일을 수정했습니다.

이럴경우 include와 tiles를 사용했을때 둘다 나머지를 따로 수정할필요가 없습니다.

알아서 모든 페이지들에 수정한 header가 적용되기 때문이죠. 그러나, 수정사항으로 header파일이 하나 더 생기게 된다면 어떻게될까요? 특정 페이지들에 대해서 새로만든 header파일이 적용되어야 한다면, 그페이지들 모두를 수정해야 할겁니다. 하지만 tiles를 사용하면 이런경우에도 크게 작업이 들어가지 않습니다. 이유는 설정부분을 설명하면서 차차 알아가보겠습니다.

 

2. 설정

 

자 이전에 올렸던 글에 이어서 계속 작업하도록 하겠습니다.

이전글은 아래 따로 링크를 걸어두었습니다.

[Spring] 03. Spring 프로젝트 생성 : http://comtk.tistory.com/7

 

2-1. 파일구조

 


 파일구조 입니다.

빨간 점이 찍혀있는 파일 및 폴더는 이번에 설정하면서 수정 혹은 생성되는 파일들입니다.

 

2-2. pom.xml

 

먼저 pom.xml을 보겠습니다.

 

 

 

pom.xml 에서 <dependencies></dependencies> 사이에 tiles dependency를 추가해주세요.

자 여기서  pom.xml은 뭐고 dependency를 선언하는이유는 무엇일까요??

 

pom.xml은 간단하게 설명하면 필요한 라이브러리를 추가하는곳 이라고 말씀드리고싶네요. 라이브러리들의 버전관리 등을 할수있어요. 그런데 사실 저도 잘 몰라요..ㅠ 공부할게 산더미입니다ㅠㅜ 일단 당장 필요한 부분만 설명드리면서 넘어가고있어요ㅠ 이후에 저도 다시 살펴볼 예정입니다ㅠㅜ!! 필요한 라이브러리를 추가하는 방법은 pom.xml<dependencies></dependencies> 사이에 필요한 라이브러리의 dependency를 추가해주면 됩니다. 그럼 나머지는 maven이 알아서 얍얍 하고 추가해줄겁니다.(인터넷 저장소에서 다운받아줘요!!)

배포판으로 export하면 라이브러리들이 추가되어서 쨔쟌! 하고 나옵니다.

 

2-3. root-context.xml

 

 

 

이미지가 가로로 좀 길어서 잘 보이실지 모르겠네요ㅠ

자 이번엔 root-context.xml입니다. root-context.xml를 열어보시면 아마 엄청 깨끗할겁니다. 저는 그랬어요.

자 그럼 아래 공간을 좀 주시고 <!-- tiles --> 아랫부분부터 </beans> 사이의 내용을 적어주시면 됩니다.

다 일일이 타이핑하셔도 되는데, 오타나면 에러나잖아요ㅠ ctrl+space 사용해서 자동완성으로 얍얍 하고 추가해주세요.

 

2-4. servlet-context.xml

 

자 이번엔 servlet-context.xml 입니다.

<beans:beans></beans:beans> 사이에 주석처리된 부분 아래 내용을 추가해주세요.

첫번째 bean은 아직 좀 더 공부해봐야 뭔가 말을해드리기 좀 애매하네요ㅠ 제가 아직 많이 못알아봤으니 패스ㅠ

두번째 bean은 tiles의 설정에 대한 class입니다. 아래 value 경로에 tiles에 대한 설정파일이 들어있다는것을 정의해주고 있습니다.

 

2-5. tiles.xml

 

이번엔 tiles.xml 입니다.

tiles에 대해 정의되어있는 내용입니다.

 

하나씩 살펴보면 먼저 맨 첫줄 name이 layout인 줄부터 보겠습니다.

definitiontemplate는 만드신 파일에 맞게 작성해주시면 됩니다. name은 편하신대로 해주시면 돼는데 이왕이면 의미있는걸로 지어주세요. aaa, asd 이런거 하지 마시구요.

먼저, nametiles-definitions에서 사용할 이름을 정의해놓은 것입니다. 뒤에 속성에 valuetemplate에 따라서 사용하는부분이 달라집니다.

template는 말그대로 템플릿 입니다. 레이아웃의 틀이되는 파일을 적어놓은 곳입니다.

어떤 모양으로 어떻게 설정할지는 각자 알아서 작성해주시면 됩니다.

제가만든 파일내용은 잠시후에 보여드리겠습니다.

 

두번째 <put-attribute/>를 보겠습니다.

보시면 template 안에 속성처럼 들어가있습니다. 이게 무슨말인가 하면, '해당 template에서는 이런 이름으로 이런파일을 가져다 쓰겠다' 라고 정의한 것입니다. 위에서 보시다시피 필요한만큼 정의해주시면 됩니다.

template이 정의되어있는 definition<put-attribute/>를 작성하면 해당 템플릿의 레이아웃에서는 고정적으로 보여지게 됩니다. 변화가 없이 모든페이지에 들어가는 header 또는 footer를 이런식으로 많이 설정해서 사용합니다.

 

그 다음 definition을 보겠습니다.

먼저 name을 보시면 name이 이상합니다. '*/*' 이라고 되어있는데 이게 무슨뜻일까요??

이것은 controller에서 return을 '*/*' 다시말해서 '경로/파일명' 이런식으로 넘겨주는데, 그에대한 패턴을 적어놓은 것입니다. 패턴이 name과 일치할경우 해당 definition이 캐치하여 그에맞는 content를 보여주는것입니다.

다음으로 definitiontemplate가 아닌 extends 라는 속성이 보입니다. 그 안에 값은 templatename값이 들어있네요. 이게 무슨의미일까요?

이건 해당 definition은 레이아웃을 설정하지 않고, 이미 설정되어있는 레이아웃을 사용한다는 의미입니다.

nameextends를 합쳐서 definition을 설명해보면 'name에 해당하는 패턴으로 controller에서 리턴을 해주면 extends의 값과 일치하는 레이아웃에 content를 보여주겠다' 가 되는것입니다.

 

자 그럼 그 안에 <put-attribute/>를 보겠습니다.

name을 보시면 'content' 라고 적혀있습니다. 그런데 이건 내용만있어요. header나 footer가 따로 없습니다.

그럼 이 파일이 보여질대는 header와 footer가 나오지 않을까요??

그렇지 않습니다. 위 definition에서 어떤 레이아웃을 사용할지 extends에서 정의하였고, 그 레이아웃에는 header와 footer가 설정되어있습니다. 그 레이아웃에 맞는 header와 footer이 같이 나오는겁니다. content는 해당 파일의 내용에 따라 계속 바뀌겠죠.

 

자 다음은 value를 보시면 '{1}/{2}.jsp' 라는것이 보입니다.

전에는 파일의 경로와 파일명이 적혀있었는데 이건 무슨의미일까요??

아까 definitionname의 패턴을 보면 '*/*'이었습니다. 이 패턴으로 결과가 오는 친구들을 캐치해서 contnet를 보여주는데, 이때 이 값이 '경로/파일명'이라고 위에 설명하였습니다. 이 경로와 파일명이 {1}{2}에 들어가는겁니다. 숫자는 *의 순서에 맞게 적어주시면 됩니다.

 

2-6. 레이아웃 및 기타 파일들

 

 

먼저 레이아웃이 되는 파일을 보겠습니다.

<tiles:insertAttribute>만 설명드리면 될거같네요.

나머지는 그냥 HTML이니 넘어가겠습니다. id와 <tiles:insertAttribute>의 name이 같아서 헷갈리실수도 있는데 달라도 전혀 지장없습니다.

 

<tiles:insertAttribute>가 작성된 부분이 아까 정의했던 파일들이 들어가는 부분들입니다.

해당 파일들이 어떻게 자기위치를 찾아가는지는 벌써 감이오신 분들도 있을겁니다.

아까 tiles.xml에서 name을 적어주셨는데, 그 name에 맞게 해당 파일들이 적용됩니다.

설정을 잘 하시면 레이아웃과 tile로 쓸 파일들을 여러개 만드시고 각각 해당 레이아웃에 맞는 각각의 타일들을 적용시키는것도 가능합니다.

 

tile들(header, footer)과 메인페이지를 보겠습니다.

내용이없으니 설명은 따로 적지않고 이미지만 올리겠습니다.

 

 

 

위에서부터 순서대로 header, footer, home 입니다.

 

마지막으로 controller에서(controller 하나밖에 없는거 다 알아요. 그거맞으니까 그거 열어보세요 ㅋㅋ) return'home' 에서 'main/home'로 바꿔줍니다. 이거는 제가 이미지를 준비 못했네요ㅠ

 

3. 결과화면

 

자 이제 설정은 다 했고, 결과를 보겠습니다.

 

 

위에 보시면 각각 파일들은 따로 작성되어 있는데 결과에서는 합쳐져서 나오는것을 볼 수 있습니다.

다음번엔 뭘할지 생각은 해뒀는데 금방 할수있을지 모르겠네요ㅠ

다음번엔 MyBatis를 적용해볼까 합니다.

다음번에도 열심히 적어볼께요!!

몇분이나 보시는지 모르겠지만... 많이들 봐주셨으면합니다 ㅋㅋ 다음시간에봐요!!


 

'개발공부 > Spring' 카테고리의 다른 글

[Spring] err-02. spring 한글 깨짐  (0) 2015.09.13
[Spring] err-01. @Autowired  (0) 2015.09.13
[Spring] 03. Spring 프로젝트 생성  (7) 2015.08.25
[Spring] 02. Spring 플러그인 추가  (0) 2015.08.24
[Spring] 01. Spring AOP  (0) 2015.08.23
: