목록중앙 HTA (2106기) story/spring java framwork story (40)
날아라쩡글이의 블로그입니다.
@PostMapping("/insert.do") public String save(BookInsertForm form) throws IOException { String saveDirectory = "C:\\spring-workspace\\spring-mybatis\\src\\main\\webapp\\resources\\images"; logger.debug("입력 폼 정보 :" + form); List bookPictures = new ArrayList(); List upfiles = form.getUpfiles();//파일을 가져온다. //업로드된 첨부파일을 지정된 폴더에 저장하고, BookPicture객체를 생성해서 파일명을 저장하고, 생성된 BookPicture객체를 List객체에 저장한다. /*..
HttpHeader객체로 header을 지정한다. multiValueMap객체로 setter로 보낼 Stirng 을 저장한다. HttpEntity 객체를 생성한다. requestEntity으로 위의 두개를 mapping한다. 보낼내용을 작성한 Dto를 생성한다. RestTemplate을 생성후 return에 보낼 url, requestEntity, Dto.class을 같이 전송한다. 웹페이지가 ajax로 받고 있다면 동일 orgin이 아니라서 다른 ajax에서는 서비스가 거부가 된다. 그렇다면 controller혹은 service에서 restcontroller에서 받고, 자바로 요청을 보낸다. 그리고 응답이 가능하게 만들면된다. restTemplate을 사용해서 요청하게 되면 응답을 json으로 보내게 ..
bookstore -------------------------------------------------------------- 백엔드(서버 사이드) 애플리케이션 src/main/java 스프링부트 애플리케이션 자바 소스 src/main/resources 스프링부트 설정파일 마이바티스 설정파일 및 매퍼파일 src/test/java -------------------------------------------------------------- 프론트엔드 애플리케이션 front-end /node-modules vue.js 관련 라이브러리 /public index.html - 서버에서 처음으로 내려받는 페이지 /src /assets - 정적 리소스가 저장되는 폴더 /components BookCard.vue..
스케쥴링 - 클라이언트와 상관없이 일정시점에 이뤄져야하는 것을 의미한다. 매일, 어느싯점, 특정한 주기로 실행되는 것을 @Scheduled 이라고 부른다. springboot는 @EnableScheduling을 진입점에 어노테이션을 부착하면 된다. 예를 들면 숙소를 예약할 때 예매한 시점으로부터 결제를 안하면 예매를 취소하는 기능을 의미한다. @SpringbootApplication위에 부착한다. maven으로 만든 경우, spring been으로 생성한 context-root.xml에 task namespace에서 누르고, taskannotation-driven으로 설정한다. 클래스를 하나 정의한다. 컴포넌트라는 어노테이션을 붙이면 자동으로 스프링의 bean으로 등록된다. 그다음은 메소드에 @Sched..
카카오 개발자 사이트에 가면 자바스크립트로 로그인 API가 작성되어있다. 앱 Key를 발급받았다는 전제하에 게시물을 작성할 예정이다. 현재 카카오개발자에 올라온 자바스크립트로 코드리뷰를 작성할 예정이다. //a태그로 버튼을 누르면 시행할 함수를 명시했다. //a태그 안에 이미지를 넣어놓아서 그 버튼이 클릭되게 만든다. kakaologin방식은 post로 controller에 전달할 수 있다 kakaologin동의 목적은 닉네임과 여러정보를 카카오에게 사져올 때 설정하는 것으로 플랫폼마다 다를 수 있다. 사용자가 창을 누르고 success:function시 엑세스 토큰, 리플레쉬토큰의 정보. 코튼2개와 완료시간 scope가 뜬다. scope의 경우 동의 항목에서 동의한 게 어떤 것인지 뜬다. 이 정보를 서..
우리는 이제까지 라이브러리와 프레임워크를 상용하여, 프론트 개발방법을 배웠다. MVC와 MVVM개발방법은 서버와 프론트가 나눠졌다는 점이다. 이전에는 백엔드는 Body부에서 책정보를 받아서 Data의 추가, 변경, 삭제등의 서비스를 제공했고, 주요동작의 경우 요청방식을 연결하여 필요정보를 /{값}/ 과 요청파라미터로 받고, JSON의 형태로 받게 되었다. 이는 서버에서 모든 것을 알아야하는 부분으로 작용했고, 단일책임의 원칙을 따르기 위하여 프론트쪽에서도 책임을 맞기로 진행했다. 그래서 처음으로 나온것이 MVC프레임워크인 앵귤러 JS를 구글에서 만들고, 양방향데이터로 사용을 많이 하게 되었다. 그러나 단점이 속도. 너무느리다는 것이다. 두번째로 일반 현재 우리가 사용하고 있는 앵귤러가 등장했다 많은 사람..
spring boot 에서 spring starter project를 선택한다. new에서 war로 선택한다. 적절한 package의 명을 작성한다. 총 5가지의 의존성을 선택한다 (타임리프트 작성시 타임리프트로 검색후 추가 ) spring web lombok spring DevTools myBatis Framwork Oracle Driver 나중에 추가가 가능하니까 finish web app가생성이 되면 serveltInitializer가 추가가된다. war로 packaging를 하면 Tomcat의 web.xml의 역할로 작동한다. webApp에 WEB-INF폴더를 생성한다. resources 폴더를 생성한다. 이제부터 여기에 Css와 JS파일, 외부 라이브러리 이미지를 폴더를 만들고 위치한다. jsp..
application property에 정의 먼저하기 mapper config의 설정 mapper파일 vo만들기 date에 모두 @JSONFormat 어노테이션 달아주기 JSON으로 보낼때 원래날짜로 입력되기 위해서 BookMapper만들기 Service만들기 web패키지 만들기 Controller @RestController json의 형태로 응답 주고 받는다. @slff4j logger를 확인할 수 있다. @CrossOrigin(Orgin="*") 정보를 가져가는 것에 대한 설정. 전체 경로 설정 @RequestMapping으로 설정(경로는 /api/으로) form insertForm dataFormat Criteria ->page, opt, value 값을 설정한다. model 응답으로 데이터를 내..
요청핸들러는 Book 응답데이터는 JSON 자바스크립트 jSON으로 응답을 받는다. Map map = new HashMap(); map.put("no",1); 이렇게 하나씩값을 주거나 List maps = new ArrayList(); map map1 = new Hashmap(); map map2 = new Hashmap(); List.add(map1); List.add(map2); 이렇게 기본자료형의 값과 문자열은 보여주면 된다. BookList컴포넌트 자식컴포넌트(List vue)를 사용한다. 자식컴포넌트에게 Books에 저장된 데이터를 전달한다. 자식컴포넌트에게는 BookList라는 props를 선언해서 전달받은 값을 저장해야한다. 이 컴포넌트가 사용하는 데이터는 data메소드가 반환하는 객체이다...
spring에서 @RestController로 JSON을 받았고 AJAX통신으로 vue.js에서 받을 예정이다. vue.js에서 npm -save install axios 설치 -->통신담당객체 package에 JSON에 axios가 추가된걸 확인할 수 있다. 서버와 통신하는 vue객체 만들기 : Service라고 되어있다. service폴더 생성하기 BookService 파일 생성 axios를 import한다 import axios from "axios"; axios를 초기화하기 그리고 반복적인 코딩은 싫으니까 http 상수 객체에 담아둔다. const http = axios.create({ //초기화하고 담는다. baseURL: 'http://localhost:8081/api', //기본적으로 받아올..
vue은 main.js에서 app과 router을 연결하고, 데이터를 뿌리는 것은 spring Boot에서 Rest방식으로 가져올 수 있다. SpringBoot는 운영환경에서도 사용가능한 프로토타입으로 프로젝트를 만들 수 있는 것이다. 실행가능한 파일을 빨리 만드는 것이다. 설정을 최소화하고 의존성라이브러리를 적는 것이 아닌 spring boot에서 UI인 체크박스로 적용한다. spring은 설정파일이 존재하지 않고, 항상 정해진 이름이 있다. 임의로 정해지고, 이름을 알려줄 필요가 없다. COC라는 방식으로 개발을 한다. 설정 보단 관례 spring Application은 빠르게 움직인다. 먼저 lombok.jar를 다운받는다. Location에서 전자정부프레임워크에서 eclipse를 선택하고 inst..
우리는 @Aspect을 만들면 된다. pom.xml에서 라이브러리를 추가한다. org.aspectj aspectjweaver 1.9.7 org.aspectj aspectjrt 1.9.7 관점지향 프로그래밍을 지원하는 라이브러리 의존성을 추가한다. aspectjrt와 aspectRutime을 다운받아준다. sample package로 aop파일을 만들어준다. package를 만들고 context-root에 등록해준다. namespace에서 aop를 체크하고 라는 위빙을 이용해서 proxy객체로 변경해주는 작업을 선언하고 다음 bean class로 aop를 선언해주면 된다. aop를 선언할 때 Aspect는 what, where, when을 설정해주면 된다. loggin모든 실행전후로 실행하고 싶다면 일단 ..
관점지향 프로그래밍 객체-객체-메소드 -값전달 객체지향 프로그래밍은 메소드로 대화하고 하나의 설계도로 여러개를 만들고 다양한 속성이 존재한다. 관점지향프로그래밍은 소스코드를 크게 2가지로 바라본다. 코드를 핵심기능과 공통기능으로 바라보는 시각이 존재한다. 핵심기능 - 학사관리, 교직원 관리에 특별하게 존재하는 기능 공통기능 - 로그출력, 인증/권한체크, 트랜잭션기능 반복적인 업무를 수행하는 것은 공통기능으로, 특별한 기능은 핵심기능으로 정의한다. 모든 class는 공통기능과 핵심기능으로 조합이 되어 있다. 업무로직메소드에서 핵심기능은 다르지만, 공통기능은 비슷하다 공통기능은 중복이 엄청많고, 핵심과 공통기능이 섞여서 구분이 어렵다. 공통과 핵심기능이 섞여있으면 공통기능변경을 하거나 추가를 할 때 반복적인..
트랜잭션이란 은행업무를 볼때 계좌이체를 진행하면 상대방계좌 증액, 내 계좌 감액이 이뤄지는데, 중간에 에러가 났을 때 이 두가지의 업무 진행이 한꺼면에 All or Not으로 진행이 되거나 취소가 되는 것을 의미한다. Service에서 엄청난 여러 작업들이 존재하며 DB Access가 이뤄진다. inser, update, delete의 작업이 이뤄지고, 업무로직 처리하거나 클라이언트의 요청을 처리할 때 All or Nothing 경우 외에는 없어야한다는 원칙이다. 전부 완벽하게 저장하거나 하나도 적용되지 않는것이다. DB Access의 작업이 바로 반영되지 않고, 작업이 완료되어야 commit이 이뤄지고 중간에 error가 발생하게 되면 rollback이 이뤄지는것이다. spring에서는 선언적 트랜잭션..
요청파라미터의 경우 폼입력값을 담는다. 그러나 @LoginUser는 요청파라미터가 새로 만든게 아니고, 원래 있던것을 사용할 것이기 때문에 어노테이션@LoginUser로 생성한다. argument로 만드는 것은 힘들지만, 한번 만들어두면 편하다는 장점이 존재한다. 인터셉터 만들기 인터셉터란 컨트롤러의 요청 핸들러 메소드 실행 전처리/후처리를 구현하는 객체이다. interceptor을 담을 패키지를 설정한다. 클래스를 생성한다. LoginCheckInterceptor으로 설정한다. HandlerInterCeptor를 상속받는다. 그리고 메소드 재정의를 진행하는데, default값으로 되어있기 때문에 강제적으로 나오지 않는다 preHandler, postHandler , afterHandler의 메소드를 재..
지금까지 코딩의 모습을 보면 @GetMapping("/add.do") public ResponseDto add,int bookNo) { User user = (User)(SessionUtils.getAttribute("LOGIN_USER")); if(user == null) { throw new CartErrorException("장바구니 아이템 추가는 로그인 후 가능합니다"); } } 이렇게 User의 객체를 SessionUtils에서 뽑아서 확인하는 방법을 이용했다. 그러나 이런 반복적인 업무를 이제는 spring의 어노테이션으로 등록하여, SessionUtils의 User을 생성하게 만들고 객체의 획득을 이용해서 사용하고, 제공받길 원한다. 그것을 AgumentResolve를 이용하여 획득하는 것이..
먼저 파일 업로드를 지원하는 라이브러리 의존성을 추가한다. maven에서 commons을 검색한다. fileupload의 의존성을 다운받고, pom.xml에 추가한다. commons-fileupload commons-fileupload 1.4 DispatcherServlet에서 Bean_name은 마음대로 설정해도 되지만 sping MVC가 사용할 수 있게 이름을 설정해두는 것이 몇가지가 존재한다. spring에서는 해당이름이 맞지 않으면 다른걸 bean으로 등록하기 때문에 마음대로 변경해서는 안된다. id를 꼭 잘 지정해야한다. 1. 파일업로드 multipartResolver 2. 국제화처리 localResolver 3.HandlerAdapter 4.HandlerMapping context-web에 첨..
완전한 Rest는 자원의 이름으로 구분하여 해당자원의 상태(자원)을 주고 받는 것이다. HTTP URL을 사용해서 자원의 이름을 명시하고 HTTP method를 사용해서 해당자원의 대한 작업을 지정하는 것이다. 지난번에는 RestController로 JSON을 올리는 방식을 진행했다. 그러면 삭제를 진행하면 어떻게 될까? 요청JSON을 올리면 응답데이터로 뭔가가 와야한다. 1. 방금 삭제한 것을 다시 내려준다. 2. 삭제 데이터에 대한 성공과 실패여부를 내려줘야한다. 삭제를 진행하게되면 우리는 지운 데이터가 다시 내려오는 것을 원치 않는 다 그렇기 때문에 삭제가 성공 혹은 실패에 대한 내용을 내려주는 것이 좋다. 모든 응답을 정형화해서 내려주는 것이 좋다. true - 잘못된 내용이다. JSON텍스트가 ..
이제는 body부내에 자바스크립트를 작성할 예정이다. HTML DOM객체가 준비되면 즉시 코딩된 스크립트가 실행된다. (HTML DOM이 화면에 렌더링 되기 전에 미리 스크립트 작업이 완료된다. 즉, 엘리먼트에 이벤트 핸들러 함수를 등록하는 것, 특정엘리먼트를 감추는 것, 서버와 통신해서 초기화면에 필요한 데이터를 획득하는 작업 등 다양한 작업을 HTML DOM이 화면에 렌더링 되기전에 수행할 수 있다. 함수안에서 선언한 모든 변수, 함수, 객체들은 그 함수의 범위를 벗어나지 않는다. 즉, 브라우져 전역객체(Window객체)를 오염시키지 않는다. 사용자가 정의한 변수나 함수가 이미 다른 사용자가 정의한 변수나 함수를 덮어쓸 가능성을 없애준다. 단점은 html태그에서 function안에 선언된 함수를 이용..
AJAX처리를 위해 RestController설정방법과 자바객체를 json텍스트로, json형식의 텍스트를 자바객체로 변환시키는 라이브러리 의존성 추가 maven에서 jackson을 검색하고 databind의 의존성을 추가한다. com.fasterxml.jackson.core jackson-databind 2.13.1 방법이 2가지가 존재한다. 첫번째는 restController의 패키기지를 만들어서 @RestController어노테이션을 붙이고 @RequestMapping("/rest/book")으로 경로를 설정하는 방법이 있다. 두번째는 일반 @Controller의 어노테이션을 붙이고 return의 객체 앞에 @ResponseType을 붙이고 작성하는 방법이다. 요청핸들러 메소드가 반환하는 값을 응답..