로컬과 배포시 설정
로컬에서는 메모리 DB를 사용하다가 배포시에는 DB설정을 변경 하여야한다.
Spring Profile(스프링 자체 기능)
로컬, 개발, 운영 설정을 jar로 다 가지고 다닌다. 어디서든 한번에 환경에 맞게 배포를 할 수 있다.
스프링 말고 다른언어가 있으면 에서는 배포에 대한 설정을 더 해야한다.
빌드도구 툴
디렉토리별로 설정파일을 만든다. 로컬, 개발, 운영에 한번에 배포하려면 3번에 걸쳐 각각 해야한다.
VM option
자바로 실행할때 옵션
java VM옵션 Helloworld 프로그램옵션
HTTP 데이터 통신
브라우저에서 post로 값을 보낼때 header에 담아서 보낸다.
브라우저에서 body에 JSON,xml등 다양한 형식으로 값을 담아서 보낼수...
2018년 4월 27일 금요일
패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 22일차(Jpa, Thymeleaf)
JPA
JPQL
Criteria Query, Query Dsl 이 있다.
@Query 어노테이션을 통해 JPQL을 이용해서 사용할 수 있다.
@Param 어노테이션은 org.springframework.data에 포함되어있다.
@Query("SELECT COUNT(b) FROM Board b WHERE b.user.name = :name")
public Long countAllByUserName(@Param("name") String name);
페이징 처리
페이지 처리를 위해서는 Pageble 객체를 사용해야 한다. Pageble은 0이 시작이다.
페이징 처리를 위한 메소드는 Page<도메인객체> 반환하도록 한다. Page에는 검색된 결과, 검색된 결과의 견수, 전체 페이지수
페이지...
2018년 4월 26일 목요일
Thymeleaf 사용법
1. th:if="${not #list.isEmpty(객체명)}"
제공 하는 메소드를 이용해서 비어있지 않을 경우 tr태그를 사용
2. th:each="board : ${list}"
list에 있는 내용을 하나씩 꺼내서 board에 대입하여 반복한다.
3. <td th:text="${board.id}"></td>
board가 가지고 있는 id프로퍼티의 값을 td태그 안의 text값으로 출력한다. 만약 이름이 kim이 라면 <td>kim</td> 와 같은 결과가 출력된다.
4. <td th:text="${#temporals.format(board.regdate, 'yyyy-MM-dd HH:mm')}"></td>
regdate는...
2018년 4월 25일 수요일
[Baekjoon]11052번 붕어빵 판매하기
1. 문제
https://www.acmicpc.net/problem/11052
2. Source
https://github.com/lalwr/algorithm/blob/master/src/Baekjoon/algorihtm_11052.java
3. 풀이
N이 4라고 가정하면
1마리까지 팔렸을때 최대이익에 한번에 3마리를 파는 이익과
2마리까지 팔렸을때 최대이익에 한번에 2마리를 파는 이익과
3마리까지 팔렸을때 최대이익에 한번에 1마리를 파는 이익과
한번에 4마리를 파는 이익을 비교해 저장하면 된다.
dp[i]...
2018년 4월 24일 화요일
패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 21일차(JPA, Resource, Thymeleaf)
Spring Boot Resource
Gradle에서 dependencies에 추가한 webjars 파일은 META-INF에 있다.
해당 폴더의 파일을 사용하려면 WebMvcconfigurer 를 구현하고 addResourceHandlers를 구현한다.
JPA
oneToMany
양방향관계
1 : N -> N을 가진 테이블에 FK가 있다고 생각하면 편하다
Many쪽이 주인공이다.
단방향일때는 oneToMany일때 one관계쪽다가 Many쪽의 Join컬럼을 적어준다. 키를 먼저 알지 못하기 때문에 insert, insert, update가 일어난다.
양방향 맵핑일때는 one관계쪽에는 @OneToMany 애노테이션에 mappedBy 옵션(Many쪽에 선언한 필드를 적는다)을 ,Many쪽에...
2018년 4월 23일 월요일
[Baekjoon]1003번 피보나치 함수
1. 문제
https://www.acmicpc.net/problem/1003
2. Source
https://github.com/lalwr/algorithm/blob/master/src/Baekjoon/algorihtm_1003.java
3. 풀이
0
1
2
3
4
5
6
f(0)
1
0
1
1
2
3
5
f(1)
0
1
1
2
3
...
2018년 4월 20일 금요일
Spring Boot 2.0에서 Gradle,Spring Security, JPA, thymeleaf, Hibernate, spring data, Message Converter
Spring Boot 2.0
JDk 1.8이상만 지원
Tomcat 8.5
Flyway 5
Hibernate 5.2
Thymeleaf 3
알아야 할 내용
기본적으로 jsp는 지원하지 않는다.
Tomcat을 설치할 필요가 없다.
tomcat을 설치하고, Spring Boot애플리케이션을 배포할 수도 있다. 이때는 jsp가 사용가능하다.(추천하지않는다.)
실행가능한 jar파일이 만들어진다.(java -jar 파일명.jar) JVM만 있으면 구동된다.
어떤 라이브러리가 있으면 라이브러리에 대한 설정을 자동으로 해준다.
H2 dbms에 대한 의존성을 추가하면, Spring boot는 in memory형태로 자동으로 Datasource를 설정한다.
@SpringBootApplication...
패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 20일차(Spring Boot, Spring Security)
재구동 없이 실행
runtime('org.springframework.boot:spring-boot-devtools')가 있으면 build만 해도 된다. WAS를 재구동 안해도 된다.
Gradle 명령어로 작업하기
실행가능한 jar파일 만들기gradle jar---> Build/libs/simpleboard-0.0.1.SNAPSHOT.jar
해당 jar 파일을 실행하기cd build/libs/jar -jar simpleboard-0.0.1.SNAPSHOT.jar종료 : ctrl + c
Spring boot 설정
jar의 표준이 없다. Spring에서 실행가능한 jar를 만들기 위한 새로운 방법을 만들었다.스프링 부트 플러그인(maven, gradle)을 이용하여 jar로 만들어야...
패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 19일차(Spring Boot, gradle, jpa, QueryDSL)
URL, URI
URI는 URL을 포함하고 있다.
URI는 유니크 하다.
Web API 디자인 가이드
URI는 정보의 자원을 표현해야 한다.
자원에 대한 행위는 HTTP Method로 표현해야 한다.
단어는 단수보다는 복수로표현한다.
URI 마지막 문자로 슬래시 구분자(/)를 포함하지 않는다.
하이픈(-)은 URI가독성을 높일때 사용
언더바(_)는 사용하지 않는다.
URI경로는 소문자만 사용한다. RFC 3986(URI문법형식)은 URI스키마와 호스트를 제외하고는 대소 문자를 구별한다.
파일 확장자는 URI에 포함시키지 않는다. Accept Header를 사용한다.
REST API에서 HATEOAS를 사용하지 않으면 Web API 부른다.
스타일 : 제약조건의 집합을 의미
Spring...
IT관련 약어 정리
IOC : Inversion of Control (제어의 역전)개발자가 만든 어떤 클래스나 메소드를 다른 프로그램이 대신 실행해주는 것을 제어의 역전
DI : Dependency Injection(의존성 주입)클래스 사이의 의존 관계를 빈(Bean) 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 ...
2018년 4월 18일 수요일
[Baekjoon]9095번 1,2,3더하기
1. 문제
https://www.acmicpc.net/problem/9095
2. Source
https://github.com/lalwr/algorithm/blob/master/src/Baekjoon/algorihtm_9095.java
3. 풀이
값이 1일때 경우의 수 : 1 -> 1개
값이 2일때 경우의 수 : 1+1, 2 -> 2개
값이 3일때 경우의 수 : 1+1+1, 2+1, 1+2, 3 -> 4개
값이 4일때 경우의 수 : 1+1+1+1, 1+1+2, 1+2+1, 2+1+1,...
jekyll 블로그 로컬에서 구동하기
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px '.Apple SD Gothic NeoI'; color: #454545}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Helvetica Neue'; color: #454545}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Helvetica Neue'; color: #454545; min-height: 14.0px}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Helvetica Neue'; color: #e4af0a}
span.s1 {font: 12.0px 'Helvetica...
docker에서 mysql 설치
docker 설치
OS에 맞는 버전을 다운받고 설치한다.
mac : https://store.docker.com/editions/community/docker-ce-desktop-mac
윈도우7,10 홈 버전 이하 : https://docs.docker.com/toolbox/toolbox_install_windows/
윈도우 10 프로 이상 : https://docs.docker.com/docker-for-windows/install/#download-docker-for-windows
yml파일을 통한 설치
docker-compose.yml...
2018년 4월 17일 화요일
패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 18일차(Docker, ViewResolver, profile, CTIP, ThreadLocal)
운영
로컬서버
개발자 컴퓨터 - 로컬 DB
개발서버
개발 서버 - 개발 DB
운영서버
운영 서버 - 운영 DB
maven profile, spring profile
profile 설정
Spring, Maven, Gradle
차이점은??
CTIP
지속적인 통합, 지속적인 TEST, 지속적인 Build
jenkins를 통해 GitHub에서 소스의 변경여부를 파악하고 테스트,빌드, report생성, error를 파악하고 사용자에게 mail, slack을 통해 통보할수 있으며 개발서버에 결과물(war, jar)파일을 deploy(배치)하며 서버를 재시작을 자동으로 해준다.
Docker
개발환경 운영환경 같은 방법으로 관리할 수 있다.
운영체제의 자원을 사용한다.
설정파일만...
ThreadLocal 개념
ThreadLocal
static한 객체한테 thread별로 같은 쓰레드 안에서는 값을 유지해 준다.
동일한 쓰레드라면 파라미터로 넘기지않아도 값을 꺼낼 수 있다.
ThreadLocal을 사용하려면 static으로 사용한다. static이 아니면 매번 필드가 메모리에 만들어 진다.
RequestContextHolder는 내부적으로 ThreadLocal이 구현되어 있다.
public class MyContext{
public static ThreadLocal threadLocalValue = new ThreadLocal<>();
public static int value;
}
package examples;
import examples.util.MyContext;
public...
[Baekjoon]1436번 1로 만들기
1. 문제
https://www.acmicpc.net/problem/1463
2. Source
https://github.com/lalwr/algorithm/blob/master/src/Baekjoon/algorihtm_1436.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Algorigtm_make1 {
public static void main(String[]...
Spring Interceptor
Interceptor
HandlerInterceptorAdapter에서 preHandle을 구현한 메소드가 false를 반환하면 컨트롤러가 실행되지 않는다.
브라우저와 DispatcherServlet와 사이에 처리할 것이 있다면 서블릿 필터를 통해 처리할 수 있다.
DispatcherServlet와 Controller 사이에서 처리할것 있다면 handlerinterceptor를 통해 할 수있다.
WebMvcConfigurerAdapter를 구현한 곳에 addInterceptors를 오버라이딩 하고 인터셉터 처리를 한 객체를 넣는다.
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter...
패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 17일차(파일업로드, Interceptor)
파일업로드
try -with -resource 구문은 close 함수를 자동으로 호출해준다.
고려사항
중복된 파일을 올리면 안된다.
하나의 폴더에 너무 많은 파일이 저장되면 관리하기 어렵다. 년/월/일 폴더를 만들고 uuid 파일이름으로 생성한다.
윈도우는 디렉토리 구분자가 '\' 이고 unix계열은 디렉토리 구분자가 '/' 이다. File.separtor을 통해 이용하여 디렉토리를 구분해야한다.
파일은 한번에 업로드처리 하는것이 아니다. Stream을 통해 올려야 한다. file.getbyets()는 사용금지
초창기에는 http, mail도 txt로 주고받았다.
외부에서는 직접 접근하면 안된다. ex) jsp를 업로드
Multipart 를 이용한다.
서블릿
HttpServletRequest는...
Spring Fileupload 관련 내용
파일업로드
try -with -resource 구문은 close 함수를 자동으로 호출해준다.
고려사항
중복된 파일을 올리면 안된다.
하나의 폴더에 너무 많은 파일이 저장되면 관리하기 어렵다. 년/월/일 폴더를 만들고 uuid 파일이름으로 생성한다.
윈도우는 디렉토리 구분자가 '\' 이고 unix계열은 디렉토리 구분자가 '/' 이다. File.separtor을 통해 이용하여 디렉토리를 구분해야한다.
파일은 한번에 업로드처리 하는것이 아니다. Stream을 통해 올려야 한다. file.getbyets()는 파일을 한번에 읽어서 처리하므로 사용하지 않는다.
초창기에는 http, mail도 txt로 주고받았다.
외부에서는 직접 접근하면 안된다. ex) jsp를 업로드
Multipart...
2018년 4월 14일 토요일
JAVA에서 String
String 관련 개념
String 변수명 = 문자 : 형식으로 구현하면 상수풀에서 관리되서 같은 문자면 주소값이 같다.
new String(문자) 형식으로 같은 문자를 넣고 구현하면 힙객체에서 관리되서 선언할때마다 주소값이 다르다.
문자열 끼리 더하면 append 함수를 많이 사용하므로 성능에 좋지 않아 StringBuffer 버퍼를 사용해서 구현한다.
StringBuffer 동기화를 지원하고 StringBuilder는 동기화를 지원 하지 않는다. 제공하는 메소드는 같다.
문자를열을 더할때 매번 String 인스턴스를...
Intellij 에서 개발소스 테스트하는 방법
Junit Test
Service단계 클래스들을 Test할때 DAO 를 호출할면 단위테스트가 아니다. Mock객체를 통해서 Service 클래스만 테스트 해야한다.
파일을 여러개 선택하고 Run ... with Coverage 를 통해 한번에 Junit 테스트를 할 수 있다.
Coverage를 볼수 있고 리포트를 출력할수 있다(리포트 출력파일은 프로젝트 경로에 하지말것)
...
패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 16일차(String, git flow, Test)
String 관련 개념
String 변수명 = 문자 : 형식으로 구현하면 상수풀에서 관리되서 같은 문자면 주소값이 같다.
new String(문자) 형식으로 같은 문자를 넣고 구현하면 힙객체에서 관리되서 선언할때마다 주소값이 다르다.
문자열 끼리 더하면 append 함수를 많이 사용하므로 성능에 좋지 않아 StringBuffer 버퍼를 사용해서 구현한다.
StringBuffer 동기화를 지원하고 StringBuilder는 동기화를 지원 하지 않는다. 제공하는 메소드는 같다.
문자를열을 더할때 매번 String 인스턴스를...
2018년 4월 13일 금요일
GitHub 코드리뷰 방법
Git Flow
master : 제품으로 출시될 수 있는 브랜치
develop : 다음 출시 버전을 개발하는 브
feature : 기능을 개발하는 브랜치
release : 이번 출시 버전을 준비하는 브랜치
hotfix : 출시 버전에서 발생한 버그를 수정 하는 브랜치
https://danielkummer.github.io/git-flow-cheatsheet/index.ko_KR.html
http://woowabros.github.io/experience/2017/10/30/baemin-mobile-git-branch-strategy.html
Git...
패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 15일차(web.xml , HTTP, Junit, Trancation, jdbc, GitHub)
Tomcat
conf - Web.xml 설정
path 가 '/' 이면 모든 요청을 처리한다는 뜻이다.
/ -> DefaultServlet이 처리 (모든 요청이 이미 예약되어있다. 정적인 파일을 처리하는 로직이 있다.)
x.jsp, x.jspx -> JSPSerlvet이 처리
프로젝트
Web.xml 설정
path를 '/' 으로 설정하면 설정이 오버라이딩 되어 DispatcherServlet가 모든요청을 처리한다.
@Controller, @RestController(@RequestMapping)을 처리
요청이 오면 DispatcherServlet이 요청받은 path를 찾고나서 없으면 Tomcat의 DefaultServlet한테 넘기고 없으면 404에러가 나온다.
동적인 파일은...
Spring 에서 HTTP Protocol(GET,POST,PUT,DELETE) 사용하기
Spring 에서 HTTP Protocol 설정
브라우저에서는 get, post만 사용할 수 있다.(@GetMapping, @PostMapping)하지만 hidden 태그와 Spring HiddenHttpMethodFilter를 통해 @PutMapping, @DeleteMapping 을 사용할수 있다.
GET(@GetMapping)
GET 방식은 HTTP 헤더에 값을 담아서 보낸다. 그래서 용량이 제한이 있다.
POST(@PostMapping)
POST방식은 HTTP body에 담아서 보낸다.
등록할때 사용한다.
PUT(@PutMapping)
수정할때 사용한다. HTTP body에 담아서 보낸다.
post방식으로 설정에 필터를 추가하고 input hidden을 만들고 put 값을 넣은후...
2018년 4월 12일 목요일
Intellij 자주쓰는 단축키 정리
Editing
Ctrl + Space : Basic code completion (the name of any class,method or variable)
Ctrl + Shift + Space : Smart code completion (filters the list of methodsand variables by expected type)
Ctrl + Shift + Enter: Complete statement
Ctrl + P : 함수호출시 인수 정보 확인 (within method call arguments)
Ctrl + Q : 코드에 대한 문서창 팝업
Shift + F1 : 코드에 대한 문서 인터넷 브라우저로 팝업
Ctrl + mouse : 코드를 링크처럼...