728x90
반응형
728x90
반응형

스프링 프레임워크를 사용하면서 root-context.xml와 servlet-context.xml 차이에 대한 궁금증에 생겨 포스팅합니다.

root-context.xml와 servlet-context.xml는 두 파일 모두 객체(bean)를 정의한다는 공통점이 있습니다.


root-context.xml 는 

 -jsp와 관련이 없는 객체(bean)를 설정해줍니다. 아래 그림과 같이(service, repository)

 -비즈니스 로직을 위한 설정입니다.


servlet-context.xml 는 

 -jsp와 관련 있는 객체(bean)를 설정해줍니다. (controller, MultipartResolver(파일 업로드), Interceptor(로그인) 등),  

 -URI와 관련 설정을 담는 클래스는 servlet-context.xml에 들어가야 합니다.

 -WEB Application에서 Client의 요청을 받기 위한 설정입니다.




https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc


root-context.xml


	
		
	
	
	
	<context:component-scan base-package="org.zerock.persistence"/>
	
	
	<context:component-scan base-package="org.zerock.service"/>
	
	>
	<context:component-scan base-package="org.zerock.aop"/>
	<aop:config/>
	
	
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
	
	
	
			
	<tx:annotation-driven/> 
  

servlet-context.xml

  
  <context:component-scan base-package="org.zerock.controller" />
	
	<!-- 17.11.1 파일 저장 경로 설정 -->
	<beans:bean id="uploadPath" class="java.lang.String">
		<beans:constructor-arg value="C:\\springUploadTest\\upload"/>
	</beans:bean>
	
	<beans:bean id="multipartResolver" 
	class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		 
	</beans:bean>
	
	
	
	
	
	
	
	
		
			<mapping path="/user/loginPost" />
			<beans:ref bean="loginInterceptor" />
		
		
		
			<mapping path="/sboard/register "/>
			<mapping path="/sboard/modifyPage" />
			<mapping path="/sboard/removePage" />
			<beans:ref bean="authInterceptor"/>
    
		
	
 

  


728x90
반응형
728x90
반응형

REST는 'Representational State Transfer'의 약어로 하나의 URI는 하나의 고유한 리소스(Resource)를 대표하도록 설계된다는 개념입니다.

최근 서버에 접근하는 기기의 종류가 다양해 지면서 다양한 기기에 공통으로 데이터를 처리할 수 이쓴 규칙을 만드는 것이 REST방식입니다.

REST API 설계 시 중요한 점

1. URI는 정보의 자원을 표현해야 합니다.

2. 자원에 대한 방식은 HTTP Method(GET, POST, PUT, DELETE)로 표현합니다.


스프링은 3버전부터 @ResponseBody 어노테이션을 지원하며 REST방식의 처리를 지원했고

@ResponseBody 어노테이션은 메소드나 리턴 타입에 사용할 수 있는 어노테이션으로 자동화된 처리 방식입니다.

최근 4버전 부터는 @RestController 어노테이션이 사용가능해졌습니다.

@RestController 어노테이션의 경우 기존의 특정한 JSP와 같은 뷰를 만들어 내는 것이 아닌 REST 방식의 데이터 처리(데이터 자체를 반환)를 위해 사용하는 어노테이션입니다. 문자열 데이터는 브라우저에서 'text/html' 타입으로 처리됩니다.


<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.8.4</version>

</dependency>    


스프링에서 jackson-databind 라이브러리를 pom.xml에 추가해줘야 합니다. jackson-databind 라이브러리는 객체를 JSON 타입의 데이터로 변환하거나, 반대의 작업을 할 때 사용합니다. JSON을 사용해야 하는 프로젝트에 반드시 필요한 라이브러리입니다.


REST 방식은 다양한 디바이스(Android나 iPhone과 같은 모바일 환경에서 서버의 데이터, HTML5, Ajax 등을 사용하는 경우)로부터 서버에 데이터와 작업을 요청하고, 결과를 받는다는 점에서 유용하지만, 일반적인 웹 페이지와는 달리 화면을 제작하지 않는 형태로 처리되기 때문에, 결과를 체크하면서 개발하기에는 적합하지 않습니다.


하지만 좀 더 쉽게 결과를 테스트 할 수 있도록 REST 클라이언트 프로그램이 존재합니다

Chrome 브라우저의 앱으로 존재하는 Advanced REST Client입니다. 

먼저 크롬에 Advanced REST Client 키워드를 검새합니다.


저는 이미 설치가 되어있는데요. 설치가 되지 않은 분들은 아래 빨간 화면에 앱 추가 버튼을 눌러주세요!





설치가 되었다면 아래와 같이 ARC 프로그램이 웹 스토어에 등록됩니다.



사용하는 방법은 RequestURL에 URL을 입력하고 전송 방식을 선택하면 됩니다.  전송 방식에 따라 추가적인 데이터를 입력할 수 있습니다.

SEND버튼을 누르면 아래와 같은 화면이 보여집니다.




728x90
반응형
728x90
반응형


런타임 오류 내용입니다.

 
org.springframework.validation.BeanPropertyBindingResult: 2 errors Field error in object 'cri' on field 'page': rejected 
value []; codes [typeMismatch.cri.page,typeMismatch.page,typeMismatch.int,typeMismatch]; arguments 
[org.springframework.context.support.DefaultMessageSourceResolvable: codes [cri.page,page]; arguments []; default 
message [page]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'int' for 
property 'page'; nested exception is java.lang.NumberFormatException: For input string: ""] Field error in object 'cri' on 
field 'perPageNum': rejected value []; codes
[typeMismatch.cri.perPageNum,typeMismatch.perPageNum,typeMismatch.int,typeMismatch]; arguments 
[org.springframework.context.support.DefaultMessageSourceResolvable: codes [cri.perPageNum,perPageNum]; 
arguments []; default message [perPageNum]]; default message [Failed to convert property value of type 
'java.lang.String' to required type 'int' for property 'perPageNum'; nested exception is 
java.lang.NumberFormatException: For input string: ""]

 


게시판 수정 중 컨트롤러에서 value=""빈칸으로 발생하여 sumbit시에 값을 읽지 못해 발생한 오류입니다.

컨트롤러에서 @ModelAttribute를 명시해주지 않아서 생긴 오류였습니다.

@RequestParam이나 @MddelAttribute 어노테이션을 사용하면 메소드의 길이가 길어지고 복잡하다고 느낄 수 있습니다.

하지만 이를 생략하는 것은 저처럼 오류를 범할 수 있으니 꼭 명시해주는게 좋습니다.


728x90
반응형
728x90
반응형

저는 form에서 submit할 때 아래와 같이 한글 깨짐이 발생하였습니다.

먼저 확인해야할 것이 있습니다.

1. 사용하는 DB환경을 확인해야 합니다.

show variables like 'c%'

jsp에서 character set이 DB의 값과 일치해야 합니다.

2. 일치하지 않는 다면 jsp에서 타입을 DB와 일치 시켜줍니다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


3. 변경하였다면 아래와 같이 글자 깨짐 현상을 해결할 수 있습니다.


4. get방식은 무조건 server.xml

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8081" protocol="HTTP/1.1" redirectPort="8443"/>

UTF-8로 변경하면 됩니다.



728x90
반응형
728x90
반응형

스프링을 다시 시작해보려고 개발환경을 설정하고 있었습니다.

MyBatis연결을 위해 MyBatis의 SqlSessionFactoryBean 설정 중에 아래와 같은 에러가 발생하였습니다.


스프링과 연동해주는 mybatis-spring의 버전이 맞춰지지 않아 생기는 에러였습니다.

https://mvnrepository.com 에서 사용하고 싶은 라이브러리를 검색하고 pom.xml에 복붙을 하면 됩니다.

이 버전을 맞추는 방법은 아래 Provided Dependencies를 찾아 버전을 확인하여 해당 버전에 맞춰주면 오류를 해결할 수 있습니다.



728x90
반응형
728x90
반응형

오늘은 파일 다중 업로드에 대해 알아보았습니다.

파일업로드 하기 전에 pom.xml에 파일업로드용 라이브러리를 추가해줍니다. (필수!)



컨트롤러 부분입니다!

path 부분에 저장하고자 하는 경로를 설정해주세요!



jsp부분입니다.



업로드를 전송하면!

alert 창이 뜨면서 

왼쪽 화면에 업로드가 잘된 것을 확인할 수 있네요!

 



파일 첨부할게요!

ajaxUpload.jsp

FileUploadController.java


728x90
반응형
728x90
반응형

AOP(Aspect Oriented Programming: 관점지향 프로그래밍)

 스프링에서 여러 개의 클래스들이 각각의 고유한 관심사에만 집중하도록 공통으로 쓰이는 로그관련모듈, 트랜잭션관련모듈, jdbc connection 관련 모듈등을 모두 다른 각각의 클래스에서 객체 생성하게 하지 말고, 스프링에서 객체 생성하고 관리하는 것입니다.


위 사진은 왼쪽의 각각의 서비스들에 로깅, 보안, 트랜잭션 기능은 강사, 학생, 컨텐츠 서비스 각 서비스의 일차적인 관심사는 아님 그러나 로깅, 보안, 트랜잭션 모듈들은 왼쪽 각 서비스들의 모듈을 참조하고 있습니다.

 

-로깅 : 프로그램 개발이나 운영 시 발생하는 문제점을 추적하거나 운영 상태를 모니터링하기 위한 텍스트, Log4j2 : 로그를 전담하는 프레임 워크(공통적인 작업을 자동화하고, 개발자로 하여금 빨리 애플리케이션을 개발하도록 하기 위한 노력의 산물)

-보안 :

-트랜잭션 : DB JAVA언어가 데이터를 주고 받는 과정에 원자성(All or Nothing)을 부여하는 수단


AOP를 이용함으로써 공통 모듈들을 관리하였습니다. 시스템의 전반적인 관심사(로깅, 보안, 트랜잭션 등)를 갖는 모듈들이 그들이 영향을 끼치는 다른 컴포넌트들(학생, 강의, 컨텐츠 서비스)을 모두 덮어버리고 각각의 서비스들은 그들의 고유 기능에 집중할 수 있게 됩니다.

 


 

AOP의 주요 개념 (핵심 기능 바라보며 공통 기능이 철저하게 분리, 개발자가 상황에 따라 핵심기능에 공통 기능을 추가할 수 있습니다.)

1) 관점(Aspect)

-구현하고자 하는 횡단 관심사의 기능을 의미, 한 개 이상의 포인트 컷과 어드바이스의 조합으로 이루어집니다.

-공통기능(로깅, 보안 ,트랜잭션) ex) 물을 트는 행위

2) 조인포인트(Join point)

-관점(Aspect)를 삽입하여 어드바이스가 적용될 수 있는 위치를 말합니다.

-핵심 기능 하나하나 ex) 밥을 짓는 행위

3) 어드바이스(Advice)

  -관점(Aspect)의 구현체로 조인 포인트에 삽입되어 동작하는 코드

-Aspect의 기능 자체

 

4) 포인트 컷(Point Cut)

 어드바이스를 적용할 조인 포인트를 선별하는 과정이나 그 기능을 정의한 모듈을 의미, 패턴 매칭을 이용하여 어떤 조인 포인트를 사용할 것인지 결정한다.

5) 타켓(Target)

 어드바이스를 받을 대상, 즉 객체를 의미, 비즈니스 로직을 수행하는 클래스일 수도 있지만, 프록시 객체가 될 수도 있습니다.

6) 위빙(Weaving) : advice point cut에 입히는 행동


출처 : http://bobr2.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%A3%BC%EC%9A%94-%EA%B0%9C%EB%85%90-%EC%9A%A9%EC%96%B43-AOPAspectoriented-programming

728x90
반응형
728x90
반응형

+ Recent posts