최근 페북을 통해 구인/구직하는 현황을 살펴보면 인맥위주인것 같습니다.
인맥도 실력도 없는 저같은 쫄병은 그저 한켠에서 반성하며 울 수 밖에 없는것 같습니다.
그들과 친해지지 못한 잘못, 실력이 없는 잘못 모두 자신을 반성하게 됩니다.
누구는 인간관계의 최소 친절을 이야기하며 과잉 친절이 싫다 이야기합니다.
누구는 제가 경력이 짧은데 이력서를 내도 되냐고 하면 이력서를 달라고 합니다. 물론 답변은 '우리는 경력자를 원한다.'입니다.
흔히 말하는 SKY, KAIST등 잘나가는 대학을 나오신 분들은 그들끼리의 업체를 운영하며 우린 차별 없어요를 외치지만 결국 회사 소개에 가보면 그들만의 리그라 낄틈은 없는것 처럼 느껴집니다.
위 경우를 중복해서 많이도 겪었고, 다 떨어졌기 때문에, 피해 의식이 있기 때문에 밤잠을 설칩니다.
벌써 오전 1시 48분인데...ㅡ.ㅜ
다 제 잘못인 것입니다. 공부 못한 죄, 지잡대 나온 죄, 어울리지 못한 죄, 머리 나쁜 죄.
어디서부터 잘못된건지 잘 알고있습니다. 첫 단추가 잘못 끼워졌습니다.
그래도 살아야 하고 나아가야 합니다. 굶어죽기 싫고, 우울하게 있기 싫기 때문입니다.
저같은 쩌리같은 사람들도 부디 잘사는 날이 왔으면 좋겠습니다.
에휴 이 피해의식.
2016년 11월 27일 일요일
20161127 최근 주변의 구직 성향
2016년 8월 21일 일요일
20160821 Spring boot + thymeleaf Image 파일 어디있는거냐!
타임리프: 스프링 부트가 밀어준다. Html 기반이다. 그래서 좋아합니다.
근데 또 프로젝트 설정을 한 후 이미지 파일 하나를 보이도록 하고싶은데.
도대체 경로를 찾을 수 없었습니다.... ㅠㅠ 아... 입개발자.
-- 아래는 @EnableWebMVC를 설정하지 않았을 경우입니다.
그래서 경로와 한참을 씨름한 후 알게된 사실을 포스팅합니다.
일단 기본적으로 예전에는
webapps/WEB-INF/
를 루트로 사용했었는데, 스프링 부트의 타임리프 스타터를 사용한 후에는
근데 또 프로젝트 설정을 한 후 이미지 파일 하나를 보이도록 하고싶은데.
도대체 경로를 찾을 수 없었습니다.... ㅠㅠ 아... 입개발자.
-- 아래는 @EnableWebMVC를 설정하지 않았을 경우입니다.
그래서 경로와 한참을 씨름한 후 알게된 사실을 포스팅합니다.
일단 기본적으로 예전에는
webapps/WEB-INF/
를 루트로 사용했었는데, 스프링 부트의 타임리프 스타터를 사용한 후에는
<!-- thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
</dependency>
src/main/resources 를 루트로
뷰 파일(.html 등)은 templates 안에
이미지, css, js 파일들은 static 안에 모아두면 절대경로처럼 사용할 수 있던것을 알게 되었습니다.
뷰 파일: src/main/resources/templates
static 파일: src/main/resources/static
그럼 이제
html에서 저 파일을 어떻게 불러오는가.
static/images/a.png 파일을 사용하려고 한다면
<img src="images/a.png"/>
<img src="/images/a.png"/>
<img th:src="@{images/a.png}"/>
<img th:src="@{/images/a.png}"/>
등 위 방법 모두 가능합니다.
아마도. ^^;
라벨:
Spring boot,
Thymeleaf
Do you wanna hear me?.....................................
모두가 아니라고 하는 길을 걸어 가 보겠다.
2016년 8월 4일 목요일
20160805 JPA 사용시 주의점!
오늘 겪은 황당스러운 에러...
잘 알아보고 사용해야 하는데 대충 사용해서 이런 사단이 났습니다.
사용 디비는 H2.
Hibernate: create table 테이블 (아이디 bigint generated by default as identity, order integer, 필드 varchar(255), primary key (필드))
ERROR o.h.tool.hbm2ddl.SchemaExport - HHH000389: Unsuccessful: create table 테이블 (아이디 bigint generated by default as identity, order integer, 필드 varchar(255), primary key (필드))
==여기==
ERROR o.h.tool.hbm2ddl.SchemaExport - Syntax error in SQL statement "CREATE TABLE 테이블 (아이디 BIGINT GENERATED BY DEFAULT AS IDENTITY, ORDER[*] INTEGER, 필드 VARCHAR(255), PRIMARY KEY (필드)) ";
expected "identifier";
또 다른 에러 내용
o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 42102, SQLState: 42S02
ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Table "테이블" not found;
정확한 원인을 모른체 계속 땅을 파던중...
진짜 마지막이다 하고 차근차근 소스 파일의 1줄부터 쭈우우욱 변경하면서 원인을 분석했습니다.
원인은
private int order;
였습니다.
저는 순서를 넣고 싶었고 order 필드를 작성했습니다.
하지만, JPA 예약어였던 것입니다(아마도...).
order라는 필드는 사용하면 안됩니다! ㅠㅠ
잘 알아보고 사용해야 하는데 대충 사용해서 이런 사단이 났습니다.
사용 디비는 H2.
Hibernate: create table 테이블 (아이디 bigint generated by default as identity, order integer, 필드 varchar(255), primary key (필드))
ERROR o.h.tool.hbm2ddl.SchemaExport - HHH000389: Unsuccessful: create table 테이블 (아이디 bigint generated by default as identity, order integer, 필드 varchar(255), primary key (필드))
==여기==
ERROR o.h.tool.hbm2ddl.SchemaExport - Syntax error in SQL statement "CREATE TABLE 테이블 (아이디 BIGINT GENERATED BY DEFAULT AS IDENTITY, ORDER[*] INTEGER, 필드 VARCHAR(255), PRIMARY KEY (필드)) ";
expected "identifier";
==여기==
==여기== 부터 ==여기== 까지 의미를 알았더라면...ㅠㅠ
또 다른 에러 내용
o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 42102, SQLState: 42S02
ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Table "테이블" not found;
정확한 원인을 모른체 계속 땅을 파던중...
진짜 마지막이다 하고 차근차근 소스 파일의 1줄부터 쭈우우욱 변경하면서 원인을 분석했습니다.
원인은
private int order;
였습니다.
저는 순서를 넣고 싶었고 order 필드를 작성했습니다.
하지만, JPA 예약어였던 것입니다(아마도...).
order라는 필드는 사용하면 안됩니다! ㅠㅠ
라벨:
JPA,
Spring boot
Do you wanna hear me?.....................................
모두가 아니라고 하는 길을 걸어 가 보겠다.
2016년 7월 15일 금요일
20160716 Spring Boot, JPA, Spring Security custom (0)
작년에 써둔 글을 조금씩 수정해서 올려볼 생각입니다.
천천히...!
개발자 화이팅!
라벨:
JPA,
Spring boot,
Spring Security
Do you wanna hear me?.....................................
모두가 아니라고 하는 길을 걸어 가 보겠다.
20160716 제대로 된 팀을 만나긴 정말 힘들다.
이전 회사의 팀이 와해되고,
각자의 길을 떠났습니다.
이전 회사 사람들간(팀 내)의 의사소통이 얼마나 자유롭고 즐거웠는지 지금 환경에서 새삼 느끼게 되었습니다.
지금은 한 명이 회사 분위기를 다 망쳐놓고, 사원들 입에서는 xx님이 너무 무섭다 는 말이 나오고 있는 상황.
저는 왜 그 한 사람의 기분에 따라 분위기가 좌우 되어야 하는지, 아무도 뭐라고 하지 않는지가 너무 궁금했습니다.
그래서 이전 회사의 팀장님께 조언을 구했는데 결국 듣게된 조언은 한약같은 조언이었습니다.
= 나서지 마세요. 그러다 너님만 이상한 사람 됩니다.
ㅎㅎㅎ
이전 팀장님 역시 회사 대표에게 아무 소리 안하고 묵묵히 팀을 위해 참았던걸 봤고,
그렇게 책임을 가진 사람을 또 만나기 힘들다는 생각을 했습니다.
어쨋든... 이전 팀이 너무나 그립네요.
각자의 길을 떠났습니다.
이전 회사 사람들간(팀 내)의 의사소통이 얼마나 자유롭고 즐거웠는지 지금 환경에서 새삼 느끼게 되었습니다.
지금은 한 명이 회사 분위기를 다 망쳐놓고, 사원들 입에서는 xx님이 너무 무섭다 는 말이 나오고 있는 상황.
저는 왜 그 한 사람의 기분에 따라 분위기가 좌우 되어야 하는지, 아무도 뭐라고 하지 않는지가 너무 궁금했습니다.
그래서 이전 회사의 팀장님께 조언을 구했는데 결국 듣게된 조언은 한약같은 조언이었습니다.
= 나서지 마세요. 그러다 너님만 이상한 사람 됩니다.
ㅎㅎㅎ
이전 팀장님 역시 회사 대표에게 아무 소리 안하고 묵묵히 팀을 위해 참았던걸 봤고,
그렇게 책임을 가진 사람을 또 만나기 힘들다는 생각을 했습니다.
어쨋든... 이전 팀이 너무나 그립네요.
2016년 6월 14일 화요일
20160614 오늘이 가장 힘들었다...
오늘이 2달 백수 생활 중 가장 힘든 날이었습니다.
그래서 오전에 엄청 어두운 이야기들을 주저리 주저리 쓰고싶은 충동에 몇 번이나 휩싸이고,
각종 시간 낭비 서비스에도 글을 좀 쓰고 접고 하는 등 아주 어두웠었죠.
그런데 항상 이런 시련 후에는 좋은 결과가(일단은) 따라오는 것 같습니다.
이번 기회에 정말 미안하고도 고마운 소상횽과 fb님께 정말 최소한 음료라도 대접해야 할 것 같습니다.
앞으로는 기술적인 블로그를 주로 할 생각입니다.
이제 더 이상 Naver.
잡담은 많이 했으니까요.
그래서 오전에 엄청 어두운 이야기들을 주저리 주저리 쓰고싶은 충동에 몇 번이나 휩싸이고,
각종 시간 낭비 서비스에도 글을 좀 쓰고 접고 하는 등 아주 어두웠었죠.
그런데 항상 이런 시련 후에는 좋은 결과가(일단은) 따라오는 것 같습니다.
이번 기회에 정말 미안하고도 고마운 소상횽과 fb님께 정말 최소한 음료라도 대접해야 할 것 같습니다.
앞으로는 기술적인 블로그를 주로 할 생각입니다.
이제 더 이상 Naver.
잡담은 많이 했으니까요.
2016년 5월 22일 일요일
20160523 나 VS 다
저는 항상 소수입니다.
혈연, 지연, 학연도 없고 그냥 맨땅에 시작했기 때문입니다.
최근 한 업체(본인이 근무하는 회사를 구멍가게로 표방)의 구인글을 보고 메일을 보냈었습니다.
그리곤 물론 떨어졌죠... ^^;
그 회사의 대표?님은 글을 기깔나게 잘 쓰시는 분 같았습니다.
이런 저런 이유로 사람 구하기도 힘들었고 뽑는데도 힘들었다.
회사에선 사람들을 잘 부려먹기 위해(나쁜 뜻 아님!) 이런 저런 방법들을 시도했고 이런 결론에 다달았다 등...
개인적으로 지원해서 떨어졌기때문에 앙탈을 좀 부리자면,
제가 받은 지원 메일의 답 메일은 달랑 한 줄이었습니다.
학력을 알려달라는... ㅡ,.ㅡ;;;
답장을 보낼까 말까 한참을 고민하다가 보냈고 떨어졌죠. ㅎㅎ
뭐 이런 저런 이유로 못 가길 참 다행이라고 생각하지만,
좀 더 인간적인 면모가 보였다면 아주 번창하길 바랬을런지도 모르겠습니다.
이놈의 소심병은 어딜 안가나봅니다.
혈연, 지연, 학연도 없고 그냥 맨땅에 시작했기 때문입니다.
최근 한 업체(본인이 근무하는 회사를 구멍가게로 표방)의 구인글을 보고 메일을 보냈었습니다.
그리곤 물론 떨어졌죠... ^^;
그 회사의 대표?님은 글을 기깔나게 잘 쓰시는 분 같았습니다.
이런 저런 이유로 사람 구하기도 힘들었고 뽑는데도 힘들었다.
회사에선 사람들을 잘 부려먹기 위해(나쁜 뜻 아님!) 이런 저런 방법들을 시도했고 이런 결론에 다달았다 등...
개인적으로 지원해서 떨어졌기때문에 앙탈을 좀 부리자면,
제가 받은 지원 메일의 답 메일은 달랑 한 줄이었습니다.
학력을 알려달라는... ㅡ,.ㅡ;;;
답장을 보낼까 말까 한참을 고민하다가 보냈고 떨어졌죠. ㅎㅎ
뭐 이런 저런 이유로 못 가길 참 다행이라고 생각하지만,
좀 더 인간적인 면모가 보였다면 아주 번창하길 바랬을런지도 모르겠습니다.
이놈의 소심병은 어딜 안가나봅니다.
라벨:
나도 회사하나 차리고싶다.,
서론과 잡담사이
Do you wanna hear me?.....................................
모두가 아니라고 하는 길을 걸어 가 보겠다.
2016년 5월 11일 수요일
20160512 또 한 번의 실패, 그리고 다시 로딩중...
일단 가장 선행되어야 할 것은 선택에 대한 후회가 없어야 한다는 점입니다.
이런 좋은 환경을 만들어주고, 저를 믿어준 마느님께 무한한 감사와 영광을 돌립니다.
...
사실 학동의 스타트업을 그만 둔 이유는 내 커리어의 뒷처짐도 한 몫을 했지만(php -> java, 그러나 Java기반의 새로운 버젼 출시를 목적으로 들어갔음) 제일 중요한 것은 'sosang횽과 일하는 것'이었습니다.
하지만 몇몇 이유로 실패(추전력을 얻기위한 무릎꿇기?)했고, 다시 무능력자 백수로 돌아왔습니다.
이 기간을 버틸 수 있었던 것은 '당연히 마느님'과 'sosang횽의 미래를 위한 투자' 덕분입니다.
어쨋든 이 기간을 최대한 활용해야 하는데, 개인 프로젝트로 친구의 홈페이지를 만들어주기로 했습니다.
사실 2~3달 정도 걸렸지만 실제 작업한건 얼마나 될지 모르겠습니다. 혼자 하는 작업이라 굉장히 더뎠고, 의도대로 공부도 이것저것 하려고 했던 이유였습니다.
결과적으로 친구의 홈페이지를 만들긴 했지만, 너무나 볼썽사납게, 반응형 디자인도 아닌 '그냥 홈페이지'가 나오게 되었습니다.
완벽한 결과물이 아니기 때문에, 아마도 다시 시간을 내서 좀더 멋지고 견고한 홈페이지로 변화시키지 않을까 생각합니다(니 일인데?).
사실 이 글의 목적은 이제부터입니다.
저는 시간 약속을 강박적으로 지키려고 노력합니다. 그 이유는 제가 매우 게으르기 때문이죠!
그래서 상대가 좀 늦는다 싶으면 칼같이 거절하곤 합니다(면접이든 약속이든). 그렇게 떠나보낸 면접이 하나있고, 기다리던 상대가 30분을 늦어 집에 가려는 찰라 전화가 와서 좀 더 기다렸던 기억도 있습니다.
뭐 그런 이유야 차지하고,
"나는 연락을 원합니다." 라고 상대방이 원한다면 당연히 연락을 해 주는 것이 인지상정 아닐까요?
심지어 자기들이 00시까지 연락을 주겠습니다. 하고 연락 안주는 ㅈ같은 회사들이 있어서 살짝 빡이 칩니다. 물론 연락 주겠다 말 안했으면 제가 먼저 연락을 달라고 이야기 했을겁니다.
어쨋든,
ㅌㅇㅌ이나 ㅇㄹㅅ같은 회사는 못들어가길(ㅠㅠ) 참 잘했다는 생각이 들고있습니다.
기본적으로 사람과의 신뢰를 중요하게 생각하는데,
저는 신뢰는 안지켜도 되는 알량한 지원자일뿐. 그들도 하등의 이상함을 느끼지 못하고 잘 지내고 있을꺼라 장담합니다.
오래간만에 나쁜 의도(?)로 글을 하나 싸고가네요.
역시 밥은 쌀과 조가 섞여야 제 맛입니다. 세상이 그런 이치겠지요?!
어쨋든 저와같은 비전공자의 나이가 어리지 않은 동료 선/후배 여러분.
기초를 쌓아 저들을 물리칩시다!
이런 좋은 환경을 만들어주고, 저를 믿어준 마느님께 무한한 감사와 영광을 돌립니다.
...
사실 학동의 스타트업을 그만 둔 이유는 내 커리어의 뒷처짐도 한 몫을 했지만(php -> java, 그러나 Java기반의 새로운 버젼 출시를 목적으로 들어갔음) 제일 중요한 것은 'sosang횽과 일하는 것'이었습니다.
하지만 몇몇 이유로 실패(추전력을 얻기위한 무릎꿇기?)했고, 다시 무능력자 백수로 돌아왔습니다.
이 기간을 버틸 수 있었던 것은 '당연히 마느님'과 'sosang횽의 미래를 위한 투자' 덕분입니다.
어쨋든 이 기간을 최대한 활용해야 하는데, 개인 프로젝트로 친구의 홈페이지를 만들어주기로 했습니다.
사실 2~3달 정도 걸렸지만 실제 작업한건 얼마나 될지 모르겠습니다. 혼자 하는 작업이라 굉장히 더뎠고, 의도대로 공부도 이것저것 하려고 했던 이유였습니다.
결과적으로 친구의 홈페이지를 만들긴 했지만, 너무나 볼썽사납게, 반응형 디자인도 아닌 '그냥 홈페이지'가 나오게 되었습니다.
완벽한 결과물이 아니기 때문에, 아마도 다시 시간을 내서 좀더 멋지고 견고한 홈페이지로 변화시키지 않을까 생각합니다(니 일인데?).
사실 이 글의 목적은 이제부터입니다.
저는 시간 약속을 강박적으로 지키려고 노력합니다. 그 이유는 제가 매우 게으르기 때문이죠!
그래서 상대가 좀 늦는다 싶으면 칼같이 거절하곤 합니다(면접이든 약속이든). 그렇게 떠나보낸 면접이 하나있고, 기다리던 상대가 30분을 늦어 집에 가려는 찰라 전화가 와서 좀 더 기다렸던 기억도 있습니다.
뭐 그런 이유야 차지하고,
"나는 연락을 원합니다." 라고 상대방이 원한다면 당연히 연락을 해 주는 것이 인지상정 아닐까요?
심지어 자기들이 00시까지 연락을 주겠습니다. 하고 연락 안주는 ㅈ같은 회사들이 있어서 살짝 빡이 칩니다. 물론 연락 주겠다 말 안했으면 제가 먼저 연락을 달라고 이야기 했을겁니다.
어쨋든,
ㅌㅇㅌ이나 ㅇㄹㅅ같은 회사는 못들어가길(ㅠㅠ) 참 잘했다는 생각이 들고있습니다.
기본적으로 사람과의 신뢰를 중요하게 생각하는데,
저는 신뢰는 안지켜도 되는 알량한 지원자일뿐. 그들도 하등의 이상함을 느끼지 못하고 잘 지내고 있을꺼라 장담합니다.
오래간만에 나쁜 의도(?)로 글을 하나 싸고가네요.
역시 밥은 쌀과 조가 섞여야 제 맛입니다. 세상이 그런 이치겠지요?!
어쨋든 저와같은 비전공자의 나이가 어리지 않은 동료 선/후배 여러분.
기초를 쌓아 저들을 물리칩시다!
2016년 4월 28일 목요일
20160429 스프링 부트 + 타임리프 + 스프링 시큐리티
https://github.com/thymeleaf/thymeleaf-extras-springsecurity
역시 삽질이 답인것 같습니다.
역시 삽질이 답인것 같습니다.
templateEngine.addDialect(new SpringSecurityDialect());
auth
.inMemoryAuthentication()
.withUser("1").password("1").roles("RR_ADMIN", "USER");
httpSecurity.authorizeRequests().antMatchers("/admin/**").hasAnyRole("RR_ADMIN");
기본 세팅을 마친 후
https://github.com/thymeleaf/thymeleaf-extras-springsecurity
에서처럼 타임리프 안에서 사용할 수 있습니다.
조만간 깃허브에 예제를 만들어 올려보도록 하겠습니다.!
커밍순!
Do you wanna hear me?.....................................
모두가 아니라고 하는 길을 걸어 가 보겠다.
2016년 3월 13일 일요일
20160313 인텔리제이(IDEA)로 스프링 코어 파헤치기!
일단 소스포지에서 스프링 코어 소스를 받습니다.
1.0이 제일 좋겠죠?
간단하고 초기버전이니 굉장히 뼈대만 있을것 같습니다. 라는 류의 글을 읽었던것 같습니다.
https://sourceforge.net/projects/springframework/files/springframework/1.0/
위에서 위스 디펜던시를 받습니다.
인텔리제이를 켠 후
프로젝트 푸롬 이그지스팅 소스를 클릭합니다.
Project from existing source?!
-> Create project from existing sources
이후 잘 읽으며 넥스트를 클릭하면 인텔리제이가 프로젝트로 인식을 합니다.
그 이후 소스를 따라가면서 읽기!
아... 초보라서 이렇게 시작하는것도 힘드네요... 삽질의 년속!
자 그럼 병신년도 화이팅!
Do you wanna hear me?.....................................
모두가 아니라고 하는 길을 걸어 가 보겠다.
2016년 3월 7일 월요일
20160307 MySQL에 뺴놓은 숫자 인덱스 추가하기!
지금까지 잘? 쓰던 테이블에 인덱스가 있기는 한데 모두 변경 가능한 컬럼이었습니다.
... 수정이랑 삭제 기능을 넣어야 하는데...
어?! .... ㅋㅋㅋㅋ
그래서 새로운 컬럼을 추가하고 기존에 있는 로우에는 인덱스(숫자)를 부여!
새로 추가하는 로우에는 자동으로 하나씩 추가할 수 있도록 설정을 해 봤습니다.
... 수정이랑 삭제 기능을 넣어야 하는데...
어?! .... ㅋㅋㅋㅋ
그래서 새로운 컬럼을 추가하고 기존에 있는 로우에는 인덱스(숫자)를 부여!
새로 추가하는 로우에는 자동으로 하나씩 추가할 수 있도록 설정을 해 봤습니다.
# 테이블에 인덱스로 사용할 컬럼을 추가
alter table 테이블이름 add(컬럼이름 컬럼타입(int, numeric등));
=> alter table test_table add(index int);
# 컬럼 삭제 (잘못 추가했을 경우)
alter table test_table drop index;
# 번호를 1부터 할당
set @num:=0;
update test_table set index = @num := @num+1;
여기까지는 기존의 로우에 인덱스를 부여한 상황
ALTER TABLE `test_table` MODIFY COLUMN `index` INT AUTO_INCREMENT;
이렇게 해주면 추후 생성되는 로우에도 인덱스가 자동으로 들어가게됩니다.
물론 insert할 때 index컬럼은 자동으로 추가됩니다. 강제로 지정하지 않으셔도 됩니다.
덧. 인덱스라고 하면 검색을 더욱 빠르게 해주는 인덱스를 생각하실 수 있는데, 그것은 따로 공부를...ㅎㅎ
비슷한 의미이긴 합니다만...
이런곳을 참조하시거나 검색하시길 바랍니다...^^;
20000.
라벨:
Index 컬럼 생성,
mysql
Do you wanna hear me?.....................................
모두가 아니라고 하는 길을 걸어 가 보겠다.
2016년 3월 1일 화요일
20160301 스프링 타임리프 + 로그 설정 간단하게
스프링은 일단...
pom.xml(메이븐),
src/main/resources,
config 패키지(각종 설정들),
controller 패키지 들을 중점으로 보면 뭔가 실마리가 하나씩 풀리는 것 같습니다.
일단 pom.xml
<!-- thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
</dependency>
<!-- logger -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
resources/logback-test.xml (스프링이 읽는 순서가 있고 logback-test는 2순위입니다.)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- Console -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>
<logger name="com.jongsam.*" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
config 패키지 ThymeleafConfig.java - 클래스 명은 상관없음
타임리프의 경우 한글 인코딩 문제나 엄격한 XHtml의 문제가 있어 조금 변경했는데
일단은 작동하는 것 같습니다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
import org.thymeleaf.templateresolver.TemplateResolver;
import nz.net.ultraq.thymeleaf.LayoutDialect;
@Configuration
public class ThymeleafConfig {
@Bean
public TemplateResolver templateResolver() {
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
templateResolver.setPrefix("/views/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("LEGACYHTML5"); // HTML5가 기본인데 엄격한
// HTML을 선호하는 타임리프이기
// 때문에 일단 템플릿 모드를
// LEGACYHTML5로 변경
templateResolver.setCacheable(false);
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.addDialect(new LayoutDialect()); // setDialect를 사용하면 안됨!
return templateEngine;
}
@Bean
public ViewResolver viewResolver() {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setCharacterEncoding("UTF-8"); // 한글관련 인코딩에서는 ViewResolver의 케릭터 셋을 추가해준다.
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setOrder(1);
return viewResolver;
}
}
마지막으로 로그 쓰는법
자세한 것은 다른 블로그들을 참조하시면 될것 같습니다.
저는 사용법만을 기록 예정입니다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
...
void test() {
logger.info("This is Logger - slf4j");
}
이렇게 몇일간의 삽질을 마무리 합니다.
이제 프론트 엔드와 싸우고 난 후 백엔드와 어드민을...ㅠㅠ
웹을 시작하는게 아니었는데...ㅠㅠ
pom.xml(메이븐),
src/main/resources,
config 패키지(각종 설정들),
controller 패키지 들을 중점으로 보면 뭔가 실마리가 하나씩 풀리는 것 같습니다.
일단 pom.xml
<!-- thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
</dependency>
<!-- logger -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
resources/logback-test.xml (스프링이 읽는 순서가 있고 logback-test는 2순위입니다.)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- Console -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>
<logger name="com.jongsam.*" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
config 패키지 ThymeleafConfig.java - 클래스 명은 상관없음
타임리프의 경우 한글 인코딩 문제나 엄격한 XHtml의 문제가 있어 조금 변경했는데
일단은 작동하는 것 같습니다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
import org.thymeleaf.templateresolver.TemplateResolver;
import nz.net.ultraq.thymeleaf.LayoutDialect;
@Configuration
public class ThymeleafConfig {
@Bean
public TemplateResolver templateResolver() {
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
templateResolver.setPrefix("/views/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("LEGACYHTML5"); // HTML5가 기본인데 엄격한
// HTML을 선호하는 타임리프이기
// 때문에 일단 템플릿 모드를
// LEGACYHTML5로 변경
templateResolver.setCacheable(false);
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.addDialect(new LayoutDialect()); // setDialect를 사용하면 안됨!
return templateEngine;
}
@Bean
public ViewResolver viewResolver() {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setCharacterEncoding("UTF-8"); // 한글관련 인코딩에서는 ViewResolver의 케릭터 셋을 추가해준다.
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setOrder(1);
return viewResolver;
}
}
마지막으로 로그 쓰는법
자세한 것은 다른 블로그들을 참조하시면 될것 같습니다.
저는 사용법만을 기록 예정입니다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
...
void test() {
logger.info("This is Logger - slf4j");
}
이렇게 몇일간의 삽질을 마무리 합니다.
이제 프론트 엔드와 싸우고 난 후 백엔드와 어드민을...ㅠㅠ
웹을 시작하는게 아니었는데...ㅠㅠ
Do you wanna hear me?.....................................
모두가 아니라고 하는 길을 걸어 가 보겠다.
2016년 2월 27일 토요일
20160228 격동의 2월과 스프링 부트
일단 제가 사람을 못믿어서 그런건지. 지금은 사람을 믿을 수 없는 일들이 많이 생긴것 같습니다.
기술자다 생각하고 기술만 신경쓰고 싶지만 그것도 잘 안되곡... 후ㅜ....
스프링 부트는!
아래 사이트를 참조했습니다. 주인장님 굉장히 감사드립니다.
http://www.namooz.com/category/spring-boot/
|
라벨:
초기 설정,
Spring boot
Do you wanna hear me?.....................................
모두가 아니라고 하는 길을 걸어 가 보겠다.
2016년 2월 22일 월요일
20160223 Spring boot + JSP, JSTL / @RestController와 @Controller
1. Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/core"
에러가 나면
pom.xml에
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
추가해주면 되는것 같습니다.
2. @RestController vs @Controller
전자에는 @ResponseBody 가 포함되어 있기때문에
뷰 템플릿을 사용하려거든 @Controller를 사용해야 합니다.
@RestController를 사용하면 String을 리턴할 경우 화면에 그 String을 보여주게 됩니다.
ㅠㅠ
에러가 나면
pom.xml에
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
추가해주면 되는것 같습니다.
2. @RestController vs @Controller
전자에는 @ResponseBody 가 포함되어 있기때문에
뷰 템플릿을 사용하려거든 @Controller를 사용해야 합니다.
@RestController를 사용하면 String을 리턴할 경우 화면에 그 String을 보여주게 됩니다.
ㅠㅠ
Do you wanna hear me?.....................................
모두가 아니라고 하는 길을 걸어 가 보겠다.
201602022 외쳐 EE!! 이클립스에서 헤로쿠 연동하기.
이클립스에서 헤로쿠 앱 푸시를 하고싶을 때는 헤로쿠 앱의 Auth key를 가지고 있어야 합니다.
헤로쿠 앱 폴더(헤로쿠에 연동할 프로젝트 폴더?)로 가서
heroku login 을 한 후
heroku auth:token을 하면 이상한 숫자 영문등의 비번이 나옴
그것을 이클립스 깃에 비밀번호로 써주면 됩니다.
아이디는 헤로쿠 웹에서 사용하는 아이디와 동일합니다.
헤로쿠 앱 폴더(헤로쿠에 연동할 프로젝트 폴더?)로 가서
heroku login 을 한 후
heroku auth:token을 하면 이상한 숫자 영문등의 비번이 나옴
그것을 이클립스 깃에 비밀번호로 써주면 됩니다.
아이디는 헤로쿠 웹에서 사용하는 아이디와 동일합니다.
2016년 1월 1일 금요일
20160102 병신년 새해
회사에서 굉장히 마음에 드는(?) 분과 일하게 되었습니다.
사는 동네도 버스 3정거장 차이이고 뭐 두루두루 좋은 것 같습니다.
저는 서버 사이드를 좋아하고 그 분은 프론트 쪽을 좋아하고, 서로 가르치고 배우고 하는 것들이 더 많아졌으면 좋겠다는 생각을 해봤습니다.
사람이라면 성악설, 성선설을 시작으로 태생부터 살아가면서 까지 자의던 타의던 자아 성찰을 하면서 살아가게 되는것 같습니다. 요즘에는 쬐끔 마음이 무거운 것 같습니다.
쨋든 올 한해도 전진!
피드 구독하기:
글 (Atom)