'Java > Language' 카테고리의 다른 글
굳이 필요한 게 아니면 enum에 toString() 을 구현하지 않는다. (1) | 2015.04.22 |
---|---|
실행가능한 JAR여부 판단하기 (0) | 2015.03.19 |
Effective Java 2nd Edition 을 읽고… (0) | 2014.11.11 |
JDK8 의 특징에 대해서 잘 설명된 포스트 (0) | 2014.05.14 |
Oracle, JDK8 정식 출시 (0) | 2014.03.20 |
굳이 필요한 게 아니면 enum에 toString() 을 구현하지 않는다. (1) | 2015.04.22 |
---|---|
실행가능한 JAR여부 판단하기 (0) | 2015.03.19 |
Effective Java 2nd Edition 을 읽고… (0) | 2014.11.11 |
JDK8 의 특징에 대해서 잘 설명된 포스트 (0) | 2014.05.14 |
Oracle, JDK8 정식 출시 (0) | 2014.03.20 |
스프링부터SpringBoot를 이용한 프로젝트에서 TemplateViewEngine으로 Velocity를 선택했다.
@Bean
public ViewResolver viewResolver() {
VelocityViewResolver viewResolver = new VelocityViewResolver();
viewResolver.setPrefix("classpath:/templates");
viewResolver.setSuffix(".vm");
viewResolver.setOrder(Ordered.LOWEST_PRECEDENCE - 20);
return viewResolver;
}
이 설정만 해서는 Velocity가 인코딩 설정을 제대로 하지 못한다.
스프링부트 설정에 application.yml을 이용했다. YAML을 설정DSL로 채택했는데, 설정이 무척 간결해진다.
Velocity와 관련된 설정은
spring:
velocity:
properties:
input.encoding: UTF-8
output.encoding: UTF-8
다음과 같이 해주면, Velocity 스프링 설정은 끝.
혹은 별도로 Velocity에 관한 설정을 하는 방법은 다음과 같다.
<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="configLocation" value="classpath:/velocity.properties"/>
</bean>
resource.loader = file
file.resource.loader.description = Velocity File Resource Loader
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
file.resource.loader.path = .
file.resource.loader.cache = false
file.resource.loader.modificationCheckInterval = 2
input.encoding=UTF-8
output.encoding=UTF-8
스프링 빈으로 설정하는 방법은
@Bean
public VelocityConfigurer velocityConfigurer() {
VelocityConfigurer configurer = new VelocityConfigurer();
configurer.setResourceLoaderPath("classpath:/templates");
Properties properties = new Properties();
properties.setProperty("input.encoding", "UTF-8");
properties.setProperty("output.encoding", "UTF-8");
configurer.setVelocityProperties(properties);
return configurer;
}
<bean id="velocityConfigurer" class="import org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath" value="classpath:/~~"/>
<property name="velocityProperties">
<props>
<prop key="input.encoding">UTF-8</prop>
<prop key="output.encoding">UTF-8</prop>
</props>
</property>
</bean>
두 가지 방법이 있다.
그냥 벨로시티를 사용하기 싫었는데...
SpringDataJPA: 스프링 프레임워크에 JPA 예외변환기 적용 (0) | 2015.08.13 |
---|---|
Quartz Schedule: DayOfMonth and DayOfWeek 관계작성에 대한 테스트 작성 (0) | 2015.02.11 |
SpringFramework 4.0 사용, JsonView MappingJacksonJsonView @Deprecate (0) | 2014.01.21 |
Hibernate, fetch=FetchType.LAZY 선언된 필드에서 문제가 생길 경우 (1) | 2014.01.10 |
Spring, AOP Logging, classcastexception proxy cannot be cast 에러 (0) | 2013.10.29 |
침대에서 뭉기적거리다가 일어나 눈을 뜨니 10시 반.
습관적으로 열어본 스마트폰에 올라와 있는 일정알림.
봄싹의 컨퍼런스가 있다는 것을 뒤늦게 인지한 나는 부랴부랴 씻고 밥먹고(점심시간 넘겨서 도착할테니, 밥은 먹고가야지)
정자동 네이버 그린팩토리를 향했다.
멀긴 멀다. ㅡ_-);; 전 회사는 1년여를 전철타고 왔다갔다 했었지.
내가 도착했을 때는 이미 세미나 중반쯤 다다른 상황이었다. 접수대에는 익숙한 얼굴들이 있었다.
그중 한 사람은 마지막 까지도 발표자료를 정리하느라 정신없었다.
발표자료: Adieu 2014, 봄싹에서 발표한 “프론트엔드 개발프로세스, 어디까지 개선할 수 있나” 발표자료
게으른 개발자
‘게으른’과 ‘개발자’의 어울림
개발자는 “1시간이면 할 일’을 ‘7~8시간동안 하는’ 사람이다.
프론트엔드의 개발자동화는 서버사이드에 비해 많이 뒤쳐져 있었다.
그러나 프론트엔드도 다양해지기 시작했다. 2~3년 사이에 빠르게 변화했다.
그 중심에는 node.js 가 있다. 프론트엔드도 자동화된 개발프로세스를 가질 수 있는 환경을 가지게 되었다.
언어에 대한 ‘커뮤니티, 문화’ 가 형성하는 문화였다?
자바에서 쓰는 방법, 루비에서 쓰는 방법.
node.js가 출현하면서 이런 환경이 생겨나기 시작했고, 2~3년의 짧은 기간 동안 일어나면서 앞으로도 빠른 변화가 일어날 것이다.
프로젝트, 라이브러리를 추가할 떄마다 반복
도구들을 소개하지만 상세한 설명은 생략한다!
bower install jquery bootstrap
component
폴더를 생성한다.recess style.css
jshint util.js
/* @Flow */
...
flow check hello.js
Grunt를 이용한 설정을 할 수 있다.
프론트엔드의 개발프로세스는 몇년 사이 매우 빠른 속도로 변화했다. node.js의 출현과 함께 npm의 패키지 관리 기능이 가져온 변화가 자바스크립트를 기반으로 하는 프론트엔드에 큰 변화를 가져왔으며, 그 변화는 앞으로도 지속될 것으로 보인다. 프론트엔드쪽에서도 백엔드와 마찬가지로 의존성을 관리하고 빌드, 배포를 자동화하려는 시도가 지속적으로 변화를 야기할 것이다. 다양한 자바스크립트 프레임워크들의 춘추전국시대가 당분간은 계속 될 것으로 보인다.
우선은, 현재에 사용목적에 적합하다고 생각되는 기술을 찾아 그것을 잘 활용하는 것에 집중하는 것만으로도 충반하다고 본다.
Spring MVC에서 정적자원(css, js, etc)을 처리해본 경험을 공유
프론트엔드에서 개발, 빌드된 정적자원을 백엔드에서 어떻게 가져와서 사용할 것인가?
registry.addResourceHander("/resources/**").addResourceLocation("/resources/*")
Spring Boot에서는 어떻게 설정할까나? -> classpath:를 붙여!!
registry.addResourceHander("/resources/**").addResourceLocation("classpath:/resources/*")
public class ResourceWebMvcConfiguration extends WebMvcConfigureAdapter { }
registry.setCachePeriod(31556926); //캐시 주기는 1년이 적당하다!?
웹을 확인하려고 하면,
프론트엔드와 백엔드의 개발을 분리하여 진행
코드에 금칠하던 냥겐의 비법공개의 느낌이랄까?
Spring Boot를 사용하면서 여기서 어떻게 더 나아갈까?
라는 고민을 하고 있던 찰라에 ‘희망의 빛’을 주는 발표였다.
지금 프로젝트는 Spring Boot를 기반으로 해서, 프로젝트의 resource 폴더에 static 폴더를 만들어 그 안에 css와 js 파일을 위치시켰는데, 생각해보니까 이녀석들을 최적화작업을 하고 하는 과정이 필요하다는 것을 간과했다. 두 개의 서브프로젝트로 나누고 프론트 프로젝트에서 최적화작업하고 그것을 백엔드 프로젝트에서 참조하는 형태로 가면 될 듯 싶다.
라이브 코딩!!
한국스프링의 살아있는 개발자, 백기선님의 발표!
ResponseEntity를 사용하면, HttpStatus 코드를 이용해서 응답상태를 결정지을 수 있어 좋다.
크롬 확장플러그인: Postman 을 통해서 설정정보를 처리
DTO
ModelMapper 사용
spock-spring 추가
groovy 추가
@ContextConfiguration(loader=SpringApplicationContextLoader.class, classes = Applications.class)
@WebApplicationConfiguration
public ExampleControllerTest extends Specification {
@Autowired
WebApplicationContext wac;
def "POST /accounts"() {
given:
when:
then:
}
}
JSON으로 리턴할 때는 ObjectMapper(By Jackson)를 등록
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigureAdapter {
..
http.csrf().disabled();
http.authorizeRequest()
...
}
UserDetails 구현
public class AccountUserDetails extends UserDetails {
}
UserDetails를 제공할 서비스 생성
@Service
public AccountUserDetailsService implements UserDetailsService {
@Autowired
AccountRepository repository;
}
WebSecurityConfig 에 userDetails 설정
@Autowired AccountUserDetailService
coufigure(AuthenBuilder auth) {
...
}
@Bean
public PasswordEncoder passwordEncoder() {
return new StandardPasswordEncoder();
}
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
만들어진 war를 배포할 수 있다.SpringBoot는 스프링을 사용하는 사람이라면 결국 끌려들어올 수밖에 없는 블랙홀과 같은 강한 마력을 가지고 있다.
물론 이것을 바탕으로 보다 강력한 힘을 사용하기 위해서는 스프링에 대한 프레임워크가 어떻게 동작하는지 이해하고, 자바가 가지고 있는 언어의 특징을 이해하는 등의 학습이 필요하지만,
먼저 만들고 본다!
라는 논리로 보자면 Spring boot는 스프링을 기반으로 한 프로젝트를 구성할 때 부딪힐 수밖에 없는 설정의 벽을 많이 낮춰주는 것이 사실이다. 기선님의 라이브 코딩은 언제나 역동적이다. 이제는 능수능란하게 청중들과 반응하며 코딩을 이끌어가는 모습에서 라이브코딩의 관록을 느낀다.
따라올테면 따라와 봐.
라며 라이브코딩을 따라오던 자와의 신경전 또한 흥미로웠다. ㅎㅎ
스프링 시큐리티를 활용하는 방법에 대해서 힌트를 얻었다. 가볍게 던지는 이야기들 속에서 JavaConfig에 대한 막연했던 것들이 가볍게 정리되며 해소되는 이런 느낌 때문에 이런 컨퍼런스를 오게 되는 것이 아닐까?
끊임없이 공부하고 코드로 만들어내는 배움의 장이었던 봄싹의 활동이 2014년 11월 30일, 그 대단원의 막을 내렸다.
이름처럼 새싹개발자들이 무럭무럭 성장하여 자신의 분야에서 한몫하는 멋진 개발자들로 성장하였다. 그들은 앞으로도 꾸준하게 개발자의 길을 걷고 있을 것이라 생각한다. ^^
나도 2011년도엔가 잠시 봄싹 스터디에 합류했다가 3주 정도 참여했다가 꼬리를 내리고 도망간 하드코어한 스터디그룹이었는데…
멋지게 유종의 미를 거둔, 봄싹의 마지막 컨퍼런스를 보면서 많은 사람들이 무엇인가를 얻어갔다는 것만으로도 충분히 보람찬 것이지 않을까?
모두 수고하셨습니다. ^^ 많은 가르침을 받았습니다.
티켓주도개발TiDD 라.... (0) | 2014.12.20 |
---|---|
Thymeleaf의 작은따옴표(‘)와 큰따옴표(“) 변환정책, 자바스크립트에서 문제 발생! (0) | 2014.12.17 |
VirtualBox "No adapter name under Host-Only Adapter" (0) | 2014.11.05 |
20141104 Tech planet 참관후기 (0) | 2014.11.04 |
Deview 2014 관람기 (0) | 2014.10.01 |
실로 오랜만에 적는 독후감(?)이다. 그 동안 이런저런 책을 읽었지만, 독후감을 써야겠다는 생각을 가지게 되는 책이 오랜만에 나타났다.
Deview 2014에 참관하러 갔다가 부스에 계신 인사이트 대표님께 인사드리면서 이야기를 하다가 가판대에 놓여있는 이 책을 발견했다. 이미 대웅에서 나온 책을 가지고 있던 상태여서 잠시 망설였지만, SNS으로 알고 계신 이병준님이 번역(http://www.buggymind.com/559)하시기도 했고 Java 7, 8 주석도 수록했다는 문구에 혹해서 그 자리에서 바로 구매했다. 결코 강요에 의해 구매한 것은 아니다.
프로그래밍을 하게 되면, 자신이 사용하고 있는 프로그래밍 언어와 관련해서 기본을 되짚어 보는 의미로 일년에 한두번 정도 읽어줘야하는 책들이 있다.
자바 쪽에서는 ‘클린코드‘, ‘Effective Java‘, ‘토비의 스프링‘ 등이 있다. Effective Java는 OO출판사에서 나온 것이 있고, 인사이트에서 이번에 출간했다. 00출판사의 서적경우에는 번역이 워낙 거시기해서 원서를 보는 것이 낫다는 평이 많은 편이다. 나 역시 읽어도 내가 읽고 있는 것이 글인지 싶을 만큼 몇줄 읽어내려가다보면 어디를 읽었는지 되짚어야할 만큼 집중도가 뚜욱 떨어진다.
인사이트에서 나온 ‘Effective Java 2nd’는 읽으면서 여러모로 흡족했다. 책크기나 종이재질도 그렇고 폰트도 그렇고.
나는 책에 줄을 치면서 책을 보는데, 책의 본문에 중요하다고 생각되는 문장마다 굵은 글씨 처리가 되어 있어서 줄을 치는 횟수가 많이 줄었다.
어쩌면 내가 허투로 보면서 넘어갈만한 요소들에도 굵은 글씨 처리가 되어 집중하게 된다. 사실 이렇게 책의 중요부분마다 굵은 글씨처리 해주는 것이 사소한듯 하지만 손이 많이 가고 번거로운 작업을 요구한다. 번역자가 그 책을 읽는 분들에게 중요하다고 알려주고 있는 것이다. 내 스타일에는 잘 어울린다.
자바 코딩과 관련된 규칙의 끝날 즈음에는 ‘요약하자면’ 으로 규칙의 내용을 간결하게 한단락으로 정리해주는 부분이 있다. 규칙을 읽어가다보면 이해가 어려웠던 부분도 ‘요약하자면’ 단락을 읽으면서 정리할 수가 있다. 쪽집게 과외 선생님이 콕하고 찝어주는 느낌이랄까?
프로그래밍을 처음 시작하면 예제를 따라서, 다른 사람의 코드를 따라서 혹은 자신만의 방법으로 코딩을 익히고 배우면서 프로그래밍을 익혀나가게 된다. 이러다보면 우리는 종종 그 프로그래밍 언어가 가지고 있는 장점과 단점, 권고사항 등을 제대로 따르지 않게되는 나쁜 습관을 가지게 되는 경우가 있다. 프로그래밍 언어에서 별다른 오류없이 컴파일되고 실행되니까 자기만의 방법으로 코딩하게 된다. 그러다보면 나쁜 냄새를 뿜어내는 프로그램이 만들어지게 될 것이다.
자바 프로그래밍을 하면서 빠지기 쉬운 착오나 자주하게 되는 실수를 짚어준다. hashCode() 메서드를 오버라이딩하면 equals() 메서드도 함께 오버라이딩 해야한다는 규칙(IDE를 사용하면 동시에 생성하도록 강제되어 있다)이라던지 등의 자바 프로그래밍과 관련된 다양한 이야기와 지식이 담겨 있다.
요약하자면, 자바 프로그래밍을 하는 이라면 책장에 꽂아두고 일년에 두번씩은 읽어줘야할 그런 책이다. 책 여기저기에 스며있는 역자의 풍부한 프로그래밍 지식이 잘 스며든 명작이 탄생했다.
꼭 사라~ 반드시 사라~
실행가능한 JAR여부 판단하기 (0) | 2015.03.19 |
---|---|
파일구분자(File.separator)를 대체하는 Path, Paths 사용하기 (1) | 2014.12.09 |
JDK8 의 특징에 대해서 잘 설명된 포스트 (0) | 2014.05.14 |
Oracle, JDK8 정식 출시 (0) | 2014.03.20 |
static factory method, 매개변수화 타입, parameterized type (0) | 2014.03.18 |
하둡과 관련해서 VirtualBox를 실행시 Network를 추가하는 과정이 필요하다. 이를 위해서
‘Host-Only Adapter’를 추가하는데, 이때 ‘Host Name’이 추가되지 않아서 실행되지 않는 문제가 발생한다.
이를 해결하는 방법은 의외로 간단하다.
설정Preference -> 네트워크Network -> [호스트 전용 네트워크]
로 이동하여 ‘+’를 선택하면 된다.
Thymeleaf의 작은따옴표(‘)와 큰따옴표(“) 변환정책, 자바스크립트에서 문제 발생! (0) | 2014.12.17 |
---|---|
Adieu 2014, 봄싹, 마지막 컨퍼런스. (0) | 2014.12.01 |
20141104 Tech planet 참관후기 (0) | 2014.11.04 |
Deview 2014 관람기 (0) | 2014.10.01 |
마우스를 두개샀다. (0) | 2014.09.25 |