전체 글
- 125DAY / 정리 : 프레임워크 2017.09.29
- 121DAY / 프로젝트 완료 보고서 완성 2017.09.25
- 113DAY / 에러페이지 만들기 2017.09.14
- 112DAY / 이미지 경로 세션얻어서 가로세로 길이 얻어오기 2017.09.12
- 109DAY / 부트스트랩 테이블 2017.09.07
- HTTP Status 500 - Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Current request is not a multipart request 2017.08.28
- 99DAY / Spring, Mybatis / ChartsJS 로 차트만들기 2017.08.24
- 98DAY / 스프링 스케쥴러 CRON식 2017.08.23
- 94DAY / W3CSchool 테마이용 가짜 쇼핑몰 생성 2017.08.18
125DAY / 정리 : 프레임워크
과목 : 프레임워크
1. IoC란?
Inversion of Control 제어의 역전
객체에 대한 제어권이 바뀐것
인스턴스의 생성부터 소멸까지 = 인스턴스 생명주기 관리를 내가 아닌 컨테이너가 대신 해주는 것
2. DI란?
Dependency Injection 의존적 주입
모듈간의 의존성을 모듈의 외부인 컨테이너에서 주입시켜주는 기능
3. AOP란?
Aspect Oriented Programming 관점 지향 프로그래밍
기능을 핵심 비지니스 로직과 공통 모듈로 구분하고,
핵심 로직에 영향을 미치치 않게 사이사이에 공통 모듈을 끼워넣도록 하는 개발방법
보안인증, 로깅 같은 공통 모듈을 코드 밖에서 비지니스 로직에 삽입하는 것이 핵심
(1)어드바이스Advice
(2)조인 포인트
(3)포인트 컷
(4)애스팩트
(5)인트로덕션
(6)위빙
4. spring mvc(@mvc)란?
5. annotarion이란?
6. ORM이란?
Object-Relational Mapping
OOP 언어와 데이터를 다루는 RDBMS 와의 상이한 시스템을 매핑하여, OOP 프로그래밍을 쉽게하도록 하기위한 기술이다
7. 빌드툴이란?
정형화된 작업을 자동화하기 위한 소프트웨어
(1)Make
(2)Ant
(3)Maven
(4)Gradle
8. 버전관리(형상관리)툴이란?
버전을 관리해준다.
CVS, SVN, Git
9. mybatis를 사용함으로써 얻을 수 있는 장점을 기술하시오.
Mybatis는 객체지향 어플리케이션에서 관계형 데이터베이스를 쉽게 사용할 수 있도록 도와주는 데이터 맵핑 프레임워크이다.
Mybatis는 별도의 XML 문서에 맵핑된 프로시져와 SQL 구문을 연동하여 데이터베이스와 연동할 수 있도록 도와주어 데이터베이스 개발에 집중할 수 있도록 돕는다. 결과적으로 복잡한 JDBC 연동 코드나 트랜잭션 코드를 간소화시킬 수 있도록 도와주며 이는 결과적으로 소스코드의 유지보수를 용이하게 돕는다. 같은 맥락이지만 ResultSet과 같이 결과값을 맵핑하는 객체 또한 자동화시켜주어 많은 라인의 소스코드를 줄일 수 있다.
SQL 및 프로시저 구문의 독립
복잡한 JDBC코드를 걷어내며 깔끔한 소스코드를 유지할 수 있다.
수동적인 파라미터 설정과 쿼리 결과에 대한 매핑구문을 제거할 수 있다.
10. Framework란?
소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것
애플리케이션 개발에 바탕이되는 템플릿과 같은역할을 하는 클래스들과 인터페이스의 집합
*컨테이너 : 당신이 작성한 코드의 처리과정을 위임받은 독립적인 존재
적절한 설정만 되어 있다면 코드를 스스로 참조한 후 알아서 객체생성과 소멸을 컨트롤해줌
보통 인스턴스의 생명주기를 관리하며 생선된 인스턴스들에게 추가적인 기능을 제공하도록 하는것
121DAY / 프로젝트 완료 보고서 완성
하루룩
cafe24주소
프로젝트 소개
프로젝트 기간 : 2017.07.03~2017.09.15(2개월 13일)
프로젝트 명 : 기상데이터 활용 소셜네트워크
프로젝트 목적 : 접속지역을 중심으로 날씨와 어울리는 옷을 공유하여 상황에 맞는 옷차림을 한다.
프로젝트 기능 : 접속지역의 현재날씨와 예보를 알려준다.
사용자 취향에 따라 맞춤 컨텐츠를 제공한다.
기온에 따른 맞춤광고로 효과를 높일 수 있다.
프로젝트 개발 툴 : STS(Spring Tool Suit), HeidiSQL, eXerd, Git
프로젝트 개발 환경 :
[ OS ] Windows 7
[ Browser ] Crome
[ WAS ] Apache Tomcat 8.0.35
[Language] Java Script,JQuery,Java,Ajax,JSP,Json,JSTL
[FrameWork] springframework, MyBatis, bootstrapspring-webmvc ,Maven
[API] 공공데이터포탈 (신)동네예보정보조회서비스, kakao API
113DAY / 에러페이지 만들기
jsp파일을 생성한 후
web.xml의 webapp안에 다음과 같이 추가한다.
1 2 3 4 | <error-page> <error-code>404</error-code> <location>/error/404.jsp</location> </error-page> | cs |
<error-code>에는 에러번호이름을 지정하고
<loaction>에는 jsp경로 설정하면 끝
112DAY / 이미지 경로 세션얻어서 가로세로 길이 얻어오기
이미지 경로 세션얻어서 가로세로 길이 얻어오기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | public float getSize(@RequestParam(value="imgroot", required=true) String imgroot , HttpServletRequest request){ // 절대 경로 읽기 String root = request.getSession().getServletContext().getRealPath("/"); // 이미지 파일 위치 String filename = root+imgroot; System.out.println("루트경로 :"+ root ); System.out.println("원본경로 :"+ imgroot ); System.out.println("이미지경로 :"+ filename ); // 이미지 읽기 Image img = new ImageIcon(filename).getImage(); float Widthsize = img.getWidth(null); //가로사이즈 float Heightsize = img.getHeight(null); //세로사이즈 System.out.println("가로 :"+ Widthsize ); System.out.println("세로 :"+ Heightsize ); float size=(Heightsize/Widthsize)*588; //비율계산 System.out.println("사이즈 :"+ size ); return size; } | cs |
109DAY / 부트스트랩 테이블
다양한 부트스트랩 테이블 소스를 제공하는 곳
http://issues.wenzhixin.net.cn/bootstrap-table/
CDN주소를 추가해주기만 하면 검색기능도, 페이지 생성도 할 필요가 없는 부트스트랩 예제이다.
단점은 정말 쉽게할 수 있어서 개발능력이 감퇴할 것 같다.
maven 프로젝트에서는 JSP추가
1 | <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.11.1/bootstrap-table.js"></script> | cs |
HTTP Status 500 - Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Current request is not a multipart request
파일업로드시 오류
multipart error
타입을 지정안해줘서..
99DAY / Spring, Mybatis / ChartsJS 로 차트만들기
1 2 3 4 5 6 7 | <resultMap type="java.util.HashMap" id="statistics"> <result javaType="java.lang.String" property="statsDate" column="date" ></result> <result javaType="java.lang.String" property="statsAmount" column="amount" ></result> </resultMap> | cs |
HashMap리스트로 받으려다가 힘들어서 그냥 DTO를 생성하였따.
getGSON으로 받아올때 차트생성해줘야지만 차트가 그려지는것 같다.
차트JS Sample
http://www.chartjs.org/samples/latest/
JSP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <head> <link rel="shortcut icon" href="resources/files/images/umbrella.ico"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.js"></script> </head> <c:set value="${cooContractNo}" var="no" /> <script> $(document).ready(function() { var chartLabels = []; // 받아올 데이터를 저장할 배열 선언 var chartData = []; var month=""; var cooContractNo = '<c:out value="${no}"/>'; function createChart() { var ctx = document.getElementById("canvas").getContext("2d"); LineChartDemo = Chart.Line(ctx, { data : lineChartData, options : { scales : { yAxes : [ { ticks : { beginAtZero : true } } ] } } }); } //selectList로 월을 선택해서 ajax로 받는다. $('#selectMonth').change(function() { var changeMonth = $('#selectMonth option:selected').val(); month = changeMonth; console.log('month:'+month); }); //버튼을 클릭하면 차트가 그려진다. createChart()함수를 안에다 선언해야지 차트값을 받더라... $('#btn').click(function(){ chartLabels = []; chartData=[]; //getJson으로 데이터 $.getJSON("./getDailyVisitor", { cooContractNo : cooContractNo, month : month }, function(data) { $.each(data, function(key, value) { chartLabels.push(value.statsDate); chartData.push(value.statsAmount); }); lineChartData = { labels : chartLabels, datasets : [ { label : "일별 방문자 수", backgroundColor:"#bfdaf9", borderColor: "#80b6f4", pointBorderColor: "#80b6f4", pointBackgroundColor: "#80b6f4", pointHoverBackgroundColor: "#80b6f4", pointHoverBorderColor: "#80b6f4", fill: false, borderWidth: 4, data : chartData } ] } createChart(); }); }) }) </script> <div class="row"> <div class="container"> <div style="margin-top:20px; margin-left:80px"> <select name="selectMonth" id="selectMonth"> <option value="1">JAN</option> <option value="2">FEB</option> <option value="3">MAR</option> <option value="4">APR</option> <option value="5">MAY</option> <option value="6">JUN</option> <option value="7">JUL</option> <option value="8">AUG</option> <option value="9">SEP</option> <option value="10">OCT</option> <option value="11">NOV</option> <option value="12">DEC</option> </select> <button id="btn">보기</button> </div> </div> <div id="graph" style="width: 80%; margin: 30px;"> <div> <canvas id="canvas" height="350" width="600"></canvas> </div> </div> </div> </div> | cs |
RESTController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | package com.ksmart.harulook.partner.controller; import java.util.HashMap; import java.util.List; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.google.gson.Gson; import com.ksmart.harulook.partner.service.PartnerInterface; import com.ksmart.harulook.partner.service.PartnerStatsDto; @RestController public class PartnerRestController { @Autowired private PartnerInterface partnerDao; @RequestMapping(value = "/getDailyVisitor", method = RequestMethod.GET) public String getDailyVisitor(HttpSession session, String month){ String cooContractNo = (String) session.getAttribute("setNo"); Gson gson = new Gson(); HashMap<String,String> map = new HashMap<String,String>(); map.put("cooContractNo",cooContractNo); map.put("month", month); List<PartnerStatsDto> list= partnerDao.selectDailyVisitor(map); return gson.toJson(list); } } | cs |
98DAY / 스프링 스케쥴러 CRON식
스프링 스케쥴러 https://spring.io/guides/gs/scheduling-tasks/
CRON 크론 표현식
초 | 분 | 시 | 일 | 월 | 요일 | 연도
0~59 | 0~59 | 0~23 | 1~31 | 1~12 | 0~6 | 생략가능
요일 : 0 (일요일) ~ 6( 토요일)
? : 설정 값 없을 때 - 일과 요일 에서만 사용가능
* : 모든조건
시작시간/단위 : 시작시간부터 해당 단위 때
시작범위-끝범위 : 시작범위 부터 끝범위까지
L : 마지막 - 일, 요일 에서만 사용가능
W : 가장 가까운 평일 찾는다 - 일 에서만 사용가능
ex) 10W
-10일이 평일 일 때 : 10일에 실행
-10일이 토요일 일 때 : 가장 가까운 평일인 금요일(9일)에 참
-10일이 일요일 일 때 : 가장 가까운 평일인 월요일(11일)에 참
# : 몇주 째인지 찾는다 - 요일 에서만 사용가능
ex) 3#2 : 수요일#2째주 에 참
예제
1) 매월 10일 오전 11시
0 1 1 10 * *
2) 매일 오후 2시 5분 0초
0 5 14 * * *
3) 10분마다 도는 스케줄러 : 10분 0초, 20분 0초...
0 0/10 * * *
4) 조건에서만 실행되는 스케줄러 : 10분 0초, 11분 0초 ~ 15분 0초까지 실행
0 10-15 * * *
스프링 스케줄러 사용하기
servlet-context.xml 환경설정
1. beans태그에 task 속성 추가
1 2 | xmlns:task="http://www.springframework.org/schema/task | cs |
2. xsi:schemaLocation 내에 코드 추가
1 2 | http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd | cs |
3. beans 태그의 자식태그 추가
1 2 3 | <context:component-scan base-package="com.ksmart.harulook.scheduler" /> <task:scheduler id="jobScheduler" pool-size="10" /> <task:annotation-driven scheduler="jobScheduler" /> | cs |
스케줄러 job생성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package com.ksmart.harulook.scheduler; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.ksmart.harulook.hof.service.HofDao; @Component public class Scheduler { Logger log = Logger.getLogger(this.getClass()); @Autowired private HofDao hofdao; /*매월 1일 0시 30분 명예의전당 입력*/ @Scheduled(cron="0 30 0 1 * *") public void HofScheduler() { try{ hofdao.insertHof(); }catch(Exception e){ e.printStackTrace(); } } } | cs |