1월, 2017의 게시물 표시

(2016년 2월1일) 하이버네이트 및 oneToMany

@OneToMany ( mappedBy = " label " ) * 나중에 User의 Question 리스트 같은 것을 아주 오래된 Question들을 캐쉬를 이용해 구현 캐쉬히트율 계산해서 * 상태값이 있는 클래스는 equals와 hashcode메소드를 구현해야 한다. * 상태값이 없는 녀석들은 안해도 된다. 전역변수에 Private User loginUser;라고 명시하면 이건 상태값을 가지는 것 이런코드는 다중쓰레드에서 안좋다. 그래서 상태값을 가지는 녀석들은 함수안에 User loginUser를 만든다. aws s3로 파일 관리 하고있음

git

이미지
* git 커밋메시지 바꾸기 git commit --amend는 메시지 수정과 마지막 커밋 수정할때 사용한다.

(Nginx) Nginx와 Tomcat연결

*Nginx가 대용량을 받는데, 특화되어있다. * Nginx -> node.js * Nginx ->python * Nginx + php /etc/nginx/sites-available/ /etc/nginx/sites-enabled -->>nginx가 이 경로의 설정파일을 자동으로 읽는다. 보통 여기서 sites-available의 설정파일을 심볼릭 링크해 사용함.

(쉘스크립트)

이미지
>chmod +x hello2.sh >./hello2.sh Mary ---->$0은 경로 읽고, $1은 첫번쨰 변수 즉, Mary

(Tomcat) 서버 자동배포

이미지
**git rev-parse master의 키값과 **git rev-parse origin/master의 키값을 비교해 나의 git의 현재상태를 비교한다. 만약 다르다면 변화가 있다는 것이다. master=$(git rev-parse master) remote=$(git rev-parse origin/master) if [[ $master == $remote]] then         echo "$ date - nothing to deploy"         exit 0 fi git merge origin/master --------------------------------------------------------------------------------------------------- #!/bin/bash export JAVA_HOME="$HOME/java" export JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom" TOMCAT=$HOME/tomcat REPO=$HOME/honux-spring-qna TARGET=$REPO/target/my-honux-0.1 cd $REPO git fetch master=$(git rev-parse master) remote=$(git rev-parse origin/master) if [[ $master == $remote ]]; then echo "[$(date)] Nothing to do" exit 0 fi echo "[$(date)] Start deploy.." echo "0. Git pull.." git merge origin/master echo "1.Stop tomcat.." $TOMCAT/bin/shutdown.sh > /dev/null ...

(디자인 패턴) 싱글톤 패턴

추천 참고 사이트: https://blog.seotory.com/post/2016/03/java-singleton-pattern

Tomcat 서버 배포

이미지
1) 톰캣 설치한다. 그후 vi .bashrc 에서 그후 source .bashrc로 적용후 env로 확인한다. 톰캣서버 실행 파란색 글씨가 배포된 애플리케이션 들이다. 즉 한개가아님. 우리가 접속하는 8080은 ROOT이다. 즉, 하나의 톰캣서버에 여러개의 어플리케이션을 배포할 수 있다는 의미다. ** 내 프로젝트를 Tomcat서버에 배포하기 위해서는 먼저 내장형 Tomcat을 제거한다. pom.xml에다가 --->provided와 war로 바꾼다.  그후 리눅스 서버에서 cloning 후 즉, ./mvnw clean package 권한 없으면 chmod +x mvnw 그 후 Tomcat/webapps폴더에서 기존 ROOT를 날리고 git에서 가져온 war파일을 ROOT.war로 바꾸어 여기에 넣는다. **Java 프로세스들의 작동여부 확인 >jps

Ajax

이미지
@GetMapping("/{id}") public Question list(@PathVariable long id){ //getter메소드를 인식해서 자동으로 JSON으로 바뀐다. return  questionRepository.findOne(id); } -->>>Question클래스의 getter메소드를 자동으로 인식해서 Json으로 바뀐다. -->>여기서 만약 또 Question클래스가 다른 클래스를 보유하고있다면 또 그 클래스 안으로 들어가게되고, 어쩌면 무한루프가 발생할 수 있다. 그래서. @JsonIgnore public List<Answer> getAnswers() { return answers; } -->>>>@JsonIgnore 어노테이션을 붙인다. ----------------------------------------------------------------------------------------------------

(Junit) 익셉션 테스트코드 작성

//@Test(expected = RuntimeException.class) 익셉션이 발생할때 OK가 되는 테스트 메소드 방식

(자바스크립트) EventDelegation(여러개의 탭 쉽게..)closest(),

Event Delegate :  Child Element들 각각에 Event Handler를 추가하는 것이 아니라 Parent Element에 Event Handler를 추가한 뒤 Event가 발생한 node를 확인하여 처리하는 방법. 장점 : 등록되는 Event Handler의 수를 줄일 수 있다. (성능에 도움이 된다.) 코드가 간결해지며 유지보수가 수월해진다. 단점 : 불필요한 Event를 filtering하는 작업이 추가된다. 참고: https://davidwalsh.name/event-delegate 참고:http://regularmotion.kr/javascript-patterns-event-delegate/ * closest()는 가장 가까운 li를 찾아줌. 즉, 가장가까운 자식을 찾아줌.

(MySQL) MySQL Password리셋

https://www.digitalocean.com/community/tutorials/how-to-reset-your-mysql-or-mariadb-root-password

(MySQL) Mysql 리눅스 설정

이미지
<service가 작동하는지 확인> sudo service mysql status <service 시작> sudo service mysql start <service 자동으로 시작> sudo update-rc.d mysql defaults <시작> * 사용자가 root이고 비밀번호가 있는 경우 mysql -u root -p -> 돈 계산시는 DEC(5,2)를 사용하는 것이 좋다. ->TIMESTAMP는 레코드를 입력한 시간이 들어간다. 예) ->ENUM타입은 String에 비해 메모리를 적게차지한다. -> 이것은 로컬의 csv파일을 불러와 서버측의 TEST테이블에 집어넣는 것.

(3주차)

이미지
쿠키와 세션은 다른듯 보이지만, 세션도 쿠키랑 같다고 볼 수 있다. *세션 데이터를 Mustache에서 사용하는 방법 properties에서 spring.mustache.expose-session-attributes = true ==========================================  <input type="hidden" name="userId" value="{{userId}}"/> 이렇게 하면 개인정보 수정에서 회원아이디는 보이고 수정은 불가능 ======================================================== html안에서 post이면서 put을 쓰는 방법 --> <input type = "hidden" name="_method" value="put" />을 넣어준다.

(3주차) 상태데이터 주의!!!(객체지향적 사고)

이미지
상황: 유저가 로그인 할떄 비밀번호를 비교하는 상황 보통               User user = userRepository.findByuserId(userId); if(user!=null && password.equals(user.getPassword()) 로 get메소드를 사용하는데, 이렇게 하면 나중에 비밀번호를 비교하는 로직을 또 만들어 중복이 발생한다. 그러므로 User클래스 안에  를 만들고 로 만든다. 이러한 사고방식이 객체지향적 사고이다. 상태데이터를 가지고 있는 녀석한테 일을 시켜라!!!!!!!!!!!!!!!!!! 여기선 user객체가 이미 password를 가지고 있다. 결국 이 상태데이터를 가지고 있으므로 이 녀석한테 password를 넘겨 일을 시키는 것이 중요하다. * 상태변경은 밖에서 하지말고 객체안에서해라

(3주차) ORM

이미지
Tomcat -> Servlet -> Controller -> List<User> ==> 톰캣이 서블릿 참조하고있고, 서블릿이 컨트롤러를 참조, 컨트롤러도 리스트 참조하는 관계 *객체를 통해 디비를 설계한다. 그래서 도메인 클래스에 @Entity를 붙인다. -> 다음과 같이 생긴다. 또한 각 변수들이 Null값을 허용하고 있다. 이를 설정해줘야 한다. Application Properties에다가 spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true 이것을 추가하면 테이블 생성되는 것을 콘솔에서 볼수 있다. 하지만 서버를 재시작할때마다 테이블이 날라가므로 spring.jpa.hibernate.ddl-auto=validate 해준다.

트러블 슈팅

** return "/~~/" 로 html 페이지 넘길시 리눅스에서는 / 를 인식 못할 수 있음 * 스프링에서의 클래스명 과 html의 value의 이름이 같으면 안된다. 예) 클래스명 Writer, value = "writer" --------------------------------------------------------------------------------------------------- #이것을 설정할 시 세션데이터를 handlebar에서 인식한다. handlebars.expose-session-attributes=true #서버배포시 이것은 true로 바꾸어야 cache가 먹힌다. 현재 테스트 단계이므로 false로 했다. handlebars.cache=false
1. 클로닝 2. chmod +x mvnw  (mvnw에 권한을 준다.) 3. /taget으로 이동 4. java -jar ~~~.jar 파일 실행

(2주차) Vim 명령어

이미지
입력모드: i 커서이동 h j k l 삭제 x 또는 X 이동: e, w, b, $, ^ , gg, G 삭제: dd, dw, 3dw, 5dd 입력모드로: i, I, o, O, a, A 복사: yy 붙여넣기: p 명령 모드 일반 모드에서 shift + ; 을 누르면 명령모드가 된다. * set nu 라고 치면 줄 번호가 나온다. http://codelion.net/weeks/overview/2 http://www.openvim.com/

(리눅스) 리눅스 명령어 및 배포

<리눅스> 0번 STDIN (default = keyboard) 1번 STDOUT (모니터) 2번 STDERR (모니터) echo "3" >(리다이렉션 명령어) 파일명 cat -파일을 stdout으로 내보내준다. * history명령어 - 여태 친 명령어가 나온다. 그후 !명령어 번호 입력 * rm 은 파일 삭제 * rmdir 은 디렉토리가 비어있을 때 삭제 * rm -rf somedir는 다 삭제 * find 디렉토리 ‑name "파일이름" * touch 파일이름 - 0바이트 파일 이름 생성 * man - 도움말 보기 * alias - 단축명령 등록 * vi .bashrc - 환경설정파일 * vi .profile - 환경설정파일 * 심볼릭 명령어 지정 ln -s apache~~~ tomcat 하면 tomcat만 써도 실행된다. --------------------------------------------------------------------------------------------------- 1. 리눅스 서버에 로그인 2. git을 이용해서 소스 가져오기 3. maven을 이용해서 빌드 4. 방화벽 설정 확인 5. 브라우져에서 동작 확인 *참고하기: https://github.com/slipp/jwp-book/tree/master/chapter3 --------------------------------------------------------------------------------------------------- * 백그라운드의 작업을 포어 그라운드로 빼는 작업 ./mvnw clean package ./mvnw spring-boot & (백그라운드에서 실행) &을 빼면 포어그라운드에서 작업 * fg는 포어그라운드로 빼기 * bg는 백그라운드로 빼기 ------------...

프로그래머로서 절대 하면 안될것

이미지

(2주차) redirect사용하는 이유

이미지
-->첫번쨰 메소드에서 redirect:/user/list2를 사용하는 이유 만약 redirect를 사용하지 않는 다면, 사용자가 회원가입을 한 후 사용자 목록으로 넘어갔다고 하자. 결과 화면은 똑같다. 하지만 거기서 새로고침을 하면 계속해서 회원이 추가되며 URL은 /create에 머물러있다. -->브라우저가 결국 2번의 요청을 하게 됨. -->또한 HTTP프로토콜은 stateless프로토콜이므로 다음과 같이 하면안된다. list메소드에서 model.addAttribute("users",users)를 해야한다. 서버는 사용자 정보를 모르므로

(1주차) git사용법 (Branch 부터~

* 새로운 브렌치 생성 // git branch devel * 해당 브렌치로 이동 //git checkout devel <.ignore 파일> *.o *.class *.sqlite logs/ -------------------------------------------------------------------------------------- Q1) 만약 로컬 저장소의 .init의 폴더가 다르며, 깃헙의 동일한 원격저장소에 넣고 싶을 때는 어떻게 해야할까? (지금 충돌일어남)

(1주차) git사용법

이미지
<작업 디렉토리> 사람이 직접 파일을 변경하는 곳 에디터, IDE 등을 통해 파일 내용을 직접 변경할 수 있다. <로컬 디렉토리> 작업 디렉토리의 작업 변경 내용을 저장하는 곳 git 명령어로 생성 및 조작 가능 내 컴퓨터에 숨김폴더로 저장됨 <원격 저장소> 원격 저장소 로컬 저장소를 서버에 복사해서 저장하는 곳을 원격 저장소라고 합 니다. 여려 명이 협업하기 위해서 필요하고 로컬 저장소가 없어졌을 때 복구하기 위해서도 필요합니다 *git 명령어로만 저장가능 $ git config ‐‐global ‐‐edit $ git config ‐‐global user.name = 'Hoyoung Jung' $ git config ‐‐global user.name $ git config ‐‐global user.email = 'honux@codesquad.kr' $ git config ‐‐global user.email $ git config --global --edit    //vi 창 전체 계정의 이메일과 이름을 저장합니다. $ mkdir git‐proj $ cd git‐proj $ git init . $ ls ‐al --->./git 폴더 생김, 이것은 로컬저장소 $ rm -rf .git/ ->git 저장소 삭제 <커밋>  커밋이란 작업 디렉토리 변경 내용을 로컬 저장소에 반영하는 것 $ echo "some text" > text.txt //echo 명령어는 텍스트 파일로 써놓는 것 $ git status //Untrackted File 이라고 뜨게 되면, git에서 신경쓰지 않는다는 의미 $ git add text.txt //Changes to be committed라고 뜨면 , commit으로 변화될 예정이다라는 의미 $ git status $ ...

(1주차) 공부내용

* group -> 프로젝트를 대표하는 ID * Artifact -> 프로젝트 고유명 * mustache -> 템플릿엔진? * devtools -> 서버를 자동으로 재시작해줌 * 스프링 프로젝트 생성시 원격에서 데이터를 받아온 데이터들은  -> 사용자디렉토리/유저이름/.m2에 위치해 있다. --------------------------------------------------------------------------------------------------- @Controller public class HelloController { @GetMapping("/hello") public String hello(){ return "hello"; } } -->GetMapping에서 Return값으로 hello를 주는데 이때 관례상 hello의 확장자는 생략해도 된다. 이 파일은 templates폴더 밑의 html 파일을 가르킨다. 그렇다면 이 확장자를 인식하는 곳은 어디인가? 답: mustache template 기본 설정에 suffix가 .html로 되어 있어요. https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html 참고 spring.mustache.suffix=.html --------------------------------------------------------------------------------------------------- @Controller public class HelloController { @GetMapping("/hello") public String hello(String name, Model model){ ...

(Redis) 레디스 데이터구조와 명령어 사용2

1. 해시데이터 1) hmset 명령은 주어진 필드와 값의 쌍을 해시 데이터에 저장한다. 즉, 주어진 모든 키와 값들을 저장하는데, 인자로 입력되는 필드와 값의 쌍은 다중입력이 가능하다. 2) hsetnx 주어진 필드가 존재하지 않을 떄 저장한다. 만약 주어진 필드가 존재한다면 값은 저장되지 않는다. 3) hmget 주어진 필드 목록을 주어진 키에서 조회한다. 4) hlen 주어진 키에 저장된 필드의 개수를 조회한다. 주어진 키의 데이터형이 해시가 아니면 오류를 돌려준다. 4) hdel 주어진 키에 저장된 필드를 제거한다. <숫자의 증감>  해시에 저장된 데이터의 필드값이 숫자일 때 hincrby, hincrbyfloat 명령으로 증감처리를 할 수 있다. 문자열 데이터에서 지원하는 숫자 증감 명령들과는 다르게 해시명령은 증가 명령만 을 지원한다. 숫자의 감소를 처리하기 위해서는 명령의 인자에 음수를 입력하면 된다. 1) hincrby 주어진 키에 저장된 필드에 숫자 증감처리를 한다. 만약 주어진 키가 존재하지 않으면 새로운 해시데이터를 생성한다. 2) hincrbyfloat 주어진 키에 저장된 필드에 숫자 증감처리를 한다. 단, 지정값은 배정밀도 flaot값이어야 하며, 소수점은 17자리로 고정되어 있다. <해시데이터의 키 목록 조회> 해시데이터 저장된 모든 키의목록과 모든 값의 목록을 조회할 때는 hgetall을 사용하면 된다. 키의 목록이나 값의 목록만을 조회하는 명령은 hkeys, hvals다. 2. 셋 데이터 <정렬된 셋 데이터> * 가중치 변경 1) zincrby 주어진 키에 저장된 셋 데이터 중 지정된 요소의 가중치를 입력된 값만큼 증가시킨다. 2) zrank 주어진 키에 저장된 셋 데이터 중 지정된 지정된 요소의 순위를 조회한다. 조회되는 순위는 0부터 시작하며, 정렬은 가중치 오름차순이다. 예를들어, 5개...

(Redis) 레디스 데이터 구조와 명령어 사용

이미지
1. 문자열 데이터 문자열 데이터는 키 하나에 문자열 하나를 저장할 수 있다. 저장 가능한 문자열의 크기는 최대 512MB이다. 레디스가 문자열 데이터를 저장할 때는 인코딩된 문자열과 몇 가지 부가 정보가 포함된 구조체로 변환하여 저장하며 이것을 레디스객체형이라 부른다. 1.1 문자열 데이터의 입력과 조회 레디스는 동시에 여러 키와 데이터를 저장하고 조회하는 mget, mset명령을 제공한다 -> mget 명령어를 통해 key54의 정보를 받아오려 했지만 데이터가 존재하지 않아 nil을 추력했다. 만약 3개의 키를 저장하려 할때, 그중 하나라도 이미 존재한다면 모두를 저장하지 않는 상황을 고려해보자. 어떻게 해야 할까? 3개의 키에 대하여 mget으로 데이터를 조회한뒤 mset으로 저장하는 방법을 생각할수 있다. 그러나 레디스는 이미 이러한 상황을 처리할 수 있는 명령어를 제공한다. 1) msetnx mset명령과 동일하게 키와 값의 쌍으로 이루어진 데이터를 저장하는데, 차이점은 키와 값의 쌍을 다중으로 입력하는 것이다. msetnx명령은 인자로 N개의 키와 값의 쌍을 요청했을 때 이미 존재하는 값이 하나라도 있다면 입력된 모든 키와 값은 저장하지 않는다. -> 이전에 수행된 mset 명령으로 nx:key3가 생성되었기 때문에 setnx 명령으로 nx:key3 키의 값이 저장되지 않았다. 비록 nx:key2가 아직 존재하지 않지만 nx:key3 키가 이미 존재하므로 전체 키가 저장되지 않았다. 2) getset getset 명령은 입력된 값을 저장하고 이전에 저장된 값을 돌려준다. -> getset 명령어로 이전에 저장된 'old value'의 값을 돌려주고 입력하는 값인 'new value'를 저장한다. 아직 존재하지 않는 newkey를 입력하면 이전에 저장된 값이 없으므로 nil을 돌려준다. --------------------------------...