프레임워크

소프트웨어 어플리케이션이나 솔루션의 개발을 수월하게 하기 위해 소프트웨어의 구체적 기능들에 해당하는 부분의 설계와 구현을 재사용 가능하도록

협업화된 형태로 제공하는 소프트웨어 환경을 말한다.

 간략하게 설명하면 프로그램 기본 구조(뼈대)라고 생각하면된다.

예시) JAVA 개발자 -> Spring , Python 개발자 -> Django, JavaScript 개발자 -> Angularjs


플랫폼

특정 장치나 시스템 등에서 이를 구성하는 기초가 되는 틀 또는 골격을 지칭하는 용어

오프라인의 가게가 될 수 도 있고 매장일 수도 있고, 온라인의 판매 시스템인 쇼핑몰, 카페, 블로그 다양한 SNS, 소셜미디어, 라이브 쇼핑몰 등 무엇인가(

컨텐츠 상품 등)를 알리고 팔고, 살 수 있는 툴(시스템)을 통틀어 플랫폼이라고 한다.

 프로그램이 실행되는 환경이며 플랫폼은 플랫폼 위에 다른 플랫폼이 존재할 수 있다. 가령, Windows에서 java로 개발하고 있으며

앱스토어에서 어플을 내려받는 과정에서 이미 3개의 플랫폼을 사용하고 있는 것이다.

플랫폼은 같은 영역에도 다양한 목적과 가치로 많이 만들어지고 있으며 모든 플랫폼에서 실행되도록 개발하기는 어렵다.

프로그램의 목적에 맞도록 플랫폼을 선택하는 것이 중요하다.

예시) Windows, Linux, macOS 등 O/S는 모두 플랫폼이다.

어플을 다운받는 앱스토어, 구글플레이, 원스토어도 플랫폼이다.


프레임워크와 플랫폼의 차이

프레임워크 : 소프트웨어 뼈대 구조

플랫폼 : 소프트웨어 실행 환경



참고 

https://blog.naver.com/kitepc/221314674197


Spring 프레임워크의 구성요소와 동작원리

http://asfirstalways.tistory.com/334



모든 트랜잭션이 같은 방식으로 동작하는 건 아니다. 전체가 같이 실패하거나 성공하는 하나의 작업으로 묶인다는 점에서는 다를바 없겠지만, 세밀히 따져보면 몇 가지 차이점이 있다. 스프링은 트랜잭션의 경계를 설정할 때 네 가지 트랜잭션 속성을 지정할 수 있다. 또, 선언적 트랜잭션에서는 롤백과 커밋의 기준을 변경하기 위해 두 가지 추가 속성을 지정할 수 있다. 선언적 트랜잭션 기준으로 보자면 모든 트랜잭션 경계는 여섯 가지 속성을 갖고 있는 셈이다.


SpringFramework의 트랜잭션 전파 속성

2개 이상의 트랜잭션이 작동할 때, 기존의 트랜잭션에 참영하는 방법을 결정하는 속성


REQUIRED 

DEFAULT : 전체 처리

 디폴트 속성이다. 모든 트랜잭션 매니저가 지원하며, 대개 이속성이면 충분하다. 미리 시작된 트랜잭션이 있으면 참여하고 없으면 새로 시작한다. 자연스럽고 간단한 트랜잭션 전파 방식이지만 사용해보면 매우 강력하고 유용하다는 사실을 알 수 있다. 하나의 트랜잭션이 시작된 후에 다른 트랜잭션 경계가 설정된 메소드를 호출하면 자연스럽게 같은 트랜잭션으로 묶인다.


SUPPORTS

기존 트랜잭션에 의존

 이미 시작된 트랜잭션이 있으면 참여하고 그렇지 않으면 트랜잭션 없이 진행하게 만든다. 트랜잭션이 없긴 하지만 해당 경계 안에서 Connection이나 하이버네이트 Session 등을 공유할 수 있다.


MANDATORY

트랜잭션에 꼭 포함 되어야 함. (트랜잭션이 있는 곳에서 호출해야 함)

 REQUIRED와 비슷하게 이미 시작된 트랜잭션이 있으면 참여한다. 반면에 트랜잭션이 시작된 것이 없으면 새로 시작하는 대신 예외를 발생시킨다. 혼자서는 독립적으로 트랜잭션을 진행하면 안 되는 경우에 사용한다.


REQUIRES_NEW ( <->REQUIRED)

각각 트랜잭션 처리(별도의 트랜잭션 처리)

REQUIRED의 반대라고 보면 된다. 항상 새로운 트랜잭션을 시작한다. 이미 진행 중인 트랜잭션이 있으면 트랜잭션을 잠시 보류시킨다. JTA 트랜잭션 매니저를 사용한다면 서버의 트랜잭션 매니저에 트랜잭션 보류가 가능하도록 설정되어 있어야 한다.


NOT_SUPPORTED ( <-> SUPPORTS)

트랜잭션에 포함 하지 않음(트랜잭션이 없는 것과 동일 함)

 SUPPORTS의 반대. 트랜잭션을 사용하지 않게 한다 . 이미 진행 중인 트랜잭션이 있으면 보류시킨다.


NEVER ( <-> MANDATORY)

트랜잭션에 절대 포함 하지 않음. 트랜잭션이 있는 곳에서 호출하면 에러 발생

트랜잭션을 사용ㅈ하지 않도록 강제한다. 이미 진행 중인 트랜잭션도 존재하면 안된다. 있다면 예외를 발생시킨다.


NESTED

 이미 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작한다. 중첩 트랜잭션은 트랜잭션 안에 다시 트랜잭션을 만드는 것이다. 하지만 독립적인 트랜잭션을 마드는 REQUIRES_NEW와는 다르다.


중첩된 트랜잭션은 먼저 시작된 부모 트랜잭션의 커밋과 롤백에는 영향을 받지만 자신의 커밋과 롤백은 부모 트랜잭션에게 영향을 주지 않는다. 예를 들어 어떤 중요한 작업을 진행하는 중에 작업 로그를 DB에 저장해야 한다고 해보자. 그런데 로그를 저장하는 작업이 실패하더라도 메인 작업의 트랜잭션까지는 롤백해서는 안되는 경우가 있다. 힘들게 처리한 시급한 작업을 단지 로그를 남기는 작업에 문제가 있다고 모두 실패로 만들 수는 없기 때문이다. 반면에 로그를 남긴 후에 핵심 작업에서 예외가 발생한다면 이때는 저장한 로그도 제거해야 한다. 바로 이럴 때 로그 작업을 메인 트랜잭션에서 분리해서 중첩 트랜잭션으로 만들어 두면 된다. 메인 트랜잭션이 롤백되면 중첩된 로그 트랜잭션도 같이 롤백되지만, 반대로 중첩된 로그 트랜잭션이 롤백돼도 메인 작업에 이상이 없다면 메인 트랜잭션은 정상적으로 커밋된다.





Springframework 트랙잭션

Dao 클래스에 PlatformTransctionManager 필드를 선언해준다.



트랜잭션 매니저를 이용하여 트랜잭션 처리를 할 곳에 트랙잭션 설정을 해준다.

밑에 두 줄은 공통으로 사용될 부분이다. 그 뒤 트랙잭션 처리할 부분을 try catch문으로 감싸게 된다.



/src/main/webapp/WEB-INF/spring/appServlet

파일안에 servlet-context.xml 에서 트랙잭션 설정을 하면 된다.


제약조건에 걸리게 되면(오류가 나면) 트랙잭션이 롤백되면서 데이터베이스가 업데이트 되지 않는다.


===============================================================================================
TransactionTemplate 은 위에 사용한 PlatformTransactionManager 인터페이스보다 더욱 많이 사용되는 TransactionTemplate 이다. 많이 사용된다는 것은 기존의 방법보다 개발자의 수고가 덜 할 수 있다는 의미이다.


servlet-context.xml에서 

위와 같이 바꿔준다음


익명 클래스를 통해서 트랙잭션을 원하는 메소드를 안에 넣어준다.



Springframework에서 DB를 사용할 때 마다 JDBC 드라이버를 로드, 커넥션 생성, DB연결, SQL실행, 자원해제를 해야한다. 이렇게 반복적인 작업으로 코드의 중복이 많이 일어난다. 우리는 Spring 빈을 이용하여 코드를 간소화 할 수 있다. 

프로젝트안에 pom.xml에서 <dependencies> </dependencies>안에

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-jdbc</artifactId>

<version>${org.springframework-version}</version>

</dependency>

을 추가해준다. 이제 데이터베이스 설정이 완료되었다.


프로젝트 파일 src/main/webapp/WEB-INF/spring/appServlet/ 의 servlet-context.xml에서 <beans:beans>에 




Controller 클래스안에 JdbcTemplate set해주고


Constant 클래스를 하나 만들어 JdbcTemplatae을 어디든지 사용할 수 있게 해준다.


그 뒤 Dao 클래스에서 Dao 클래스 생성자에 template = Constant.template을 해주어 template을 사용할 수 있게 한다.

이제 Dao 클래스에서 template을 사용하면 된다. Jdbctemplate의 CRUD는 다음에 포스팅하겠다.

웹어플리케이션에서 데이터의 유효성을 검사하기 위한 방법으로 Front단에서 Javascript를 이용해 사용하는 방법이 있고, Back-end에서 Validator 객체를 사용하는 방법이 있다.

커맨드 객체의 유효성을 검사하기 위해 Validator 인터페이스를 사용하는 방법에 대해서 알아보겠다.


먼저 Student 클래스를 만들어 필요한 데이터들을 클래스화 해준다.


먼저 Validator를 인터페이스한 클래스를 하나 만들어준다.

Validator 을 인터페이스에서 검색 한 후 2번째에 있는 것을 클릭해준다.


Validator 인터페이스를 받은 클래스는 다음과 같이 2가지 메소드가 자동으로 오버라이딩된다. 첫 번째 supports 메소드는 검증할 객체의 클래스 타입 정보를 명시해준다.

두 번째 validate 메소드는 parameter 객체를 두 개 받는데 첫 번째 파라미터는 무엇이 들어올지 모르기때문에 Object로 받는다. 두 번째 파라미터는 에러객체이다.


이제 Controller 에서 Validator을 사용하면 된다. 검증 시 에러가 있으면 로그인 되지 않고 에러가 없으면 로그인 성공 페이지로 이동한다.



ValidationUtils.rejectIfEmptyOrWhitespace(errors,"name","trouble");

Spring이 제공해 주는 메소드이다. 비어있거나 공백이면 에러에 name,trouble 값을 넣어준다.


================================================================================================================================================


이제 @Valid 어노테이션을 사용해 간단하게 유효성 검사하는 법을 알아보자.

제일 먼저 pom.xml 파일에서 dependency를 추가해야한다.

버젼은 5.2.4.Final 해도 된다. 


커맨드 객체 앞에 @Valid를 추가해주고 밑에 initBinder 메소드를 추가하면 알아서 spring이 알아서 에러를 찾아준다.


Spring framework GET/POST @RequestMapping에 대해서 알아봅시다.



GET과 POST 형식으로 데이터를 받을 때 간단히 RequestMapping 부분에 GET과 POST만 따로 적어주면된다.



----------------------------------------------------------------------------------------------------

@ModelAttribute 어노테이션을 이용하면 커맨드 객체의 이름을 바꿀 수 있다.


-----------------------------------------------------------------------------------------------------


리다이렉트(redirect)

서버안에서 redirect 를 할 수 있고


http:// 로 redirect 할 수있다.



Spring framework form 간에 데이터 이동 - ①HttpServletRequest 클래스를 이용한 방법


controll 클래스에 해당 경로를 매핑 해준뒤에 httpServletRequest로 GET이나 POST 형식으로 데이터를 불러와 그것을 다시 model 객체를 이용해 view페이지로 이동시켜 준다.


------------------------------------------------------------------------------------------------------------------------


Spring framework form 간에 데이터 이동 - ②RequestParam 어노테이션을 이용

controll 클래스에서 RequestParam으로 GET이나 POST로 넘어온 데이터를 받는다. 그것을 다시 model 객체를 이용해 view로 넘겨준다.

------------------------------------------------------------------------------------------------------------------------


이와 같은 2가지 방법을 통해 데이터를 폼간 폼으로 이동할 수 있지만 데이터량이 많으면 매우 복잡하고 가독성이 떨어 질 수 있다. 

이것을 개선하기 위해 데이터(커맨드) 객체를 이용한다.



Member 클래스에 데이터들을 getter setter 해준다음 그 클래스를 커맨드 객체(Member)를 바로 넣어준다.

jsp에서 바로 불러와 처리를 할 수 있게 시스템 내에서 해준다.


Spring framework MVC 모델에서 Controller에 대해서 알아보자



@Controller 으로 어노테이션 해주면 이 클래스가 컨트롤러 클래스라는 것을 명시하는 설정이 된다.

@RequestMapping("경로")를 어노테이션 해주면 요청 경로로 지정되고 리턴으로 뷰페이지로 반환된다.


데이터를 이동할 때 model 객체를 이용하면 손쉽게 뷰페이지로 데이터를 이동 시킬 수 있다. 위에 방식은 파라미터로 데이터를 받는것이다


ModelAndView 타입의 메소드는 위와 같이 사용한다. ModelAndView 는 생성자와 뷰내임을 동시에 가지고 있기 때문에 반환하는 값을 객체로 만들었던 그 값을

반환해주면 된다.


클래스 위에 RequestMapping을 하면 메소드 위에 매핑한것과 경로를 더한뒤에 값을 찾아간다.

즉, 클래스 위 @RequestMapping("/board")   메소드 위 @RequestMapping("/write") 이면 두개의 조합 /board/write 로 경로를 요청한다.

Spring Framework 한글 적용

web.xml 파일에 들어가서

각 jsp 파일마다 

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

적어주면 된다.


'프로그래밍 > Spring Framework' 카테고리의 다른 글

Spring framework form 간에 데이터 이동  (0) 2018.08.07
자바 Spring framework MVC 모델 - Controller  (0) 2018.08.06
자바 Spring framework MVC 모델  (0) 2018.08.06
Spring AOP  (0) 2018.08.03
Spring Environment 객체  (0) 2018.08.02

+ Recent posts