Tag Archives: JAVA

Java Coding Style Guide(Coding Convention,NamingRule)

대소문자와 밑줄 사용

camelCase

변수명, 메서드명에 사용

약자인 경우에는 대문자를 연속해서 쓰는 경우가 있는데 글자수에 따른 변동이 있음

2글자 VO, 그냥 두개 대문자로 쓰는게 일반적인 룰이지만.. 사람에 따라

3글자 Dto, Api, 3글자 이상부터는 뒤에는 소문자로 쓰는게 룰이라고 하지만… userDTO, smsAPI와 같이 3글자 다 대문자로 쓰는경우도 많다. 대문자로 쓰자그냥

4글자 이상. 몰라

 

자주쓰이는 약자들만 프로젝트 단위별로 정해놓고 쓰면 되겠다.

이것들은 그냥 대문자로 쓰자

DTO, VO, API

 

snake_case

json, xml에만 사용 소스코드에는 사용하지 않음

_number

타 언어에서 전역변수에 사용하는데 자바에서는 (잘)사용하지않음

C하던사람들이 자바하면 이런거 많이씀

__number

타 언어에서 접근금지 변수에 사용하는데 자바에서는 사용하지 않음

 

data class suffic

Entity : JPA(ORM)

Dto : API 호출

VO : Mybatis 접근

Model

Data

Wrapper : Dto 의 묶음. 대부분 고정된 형태 외부 프레임

 

json을 읽어들일때: ~JsonModel

SpringBoot –

spring command line – 커맨드라인에서 실행되지 않는 자바언어에 커맨드라인툴은 별쓸모없다

되게쉽고 편하다고 그러는데.. 애초에 자바기술이 그렇게 편하고 쉽게 만들어지지 않았다.
그렇게 편하고 쉬운걸 찾으려면 루비를 하는게 낫다.

복잡한 스프링 생태계를 쑤셔담아놓은 스프링프레임워 풀세트프레임워크로 포함된 기술을 다 이해하고 사용해야한다.
이걸 커스터마이징 해서 쓸 수 있는정도면 이미 스프링 애플리케이션을 혼자 구성할 수 있는 실력일거다.
결코 쉽지는 않다.

초보자가 튜토리얼 보면서 아 이렇게 되는구나 하면서 따라하기는 쉽겠지만
뭔가를 변경하는것 예를들어, 타임리프말고 다른 뷰템플릿을 적용을 하기는 오히려 더 어려울거다.

프로젝트 초기화 방법

spring command line interface
spring initializer (http://start.spring.io)

설정

@Enable 실행할거 선택 EnableRabbit. 이라던가
@Grab 의존성 가져오기. gradle에서 하지
@EnableAutoConfiguration(exclude= 특정모듈 .exclude 가능.

네이밍을 느슨하게 인식
message.module.name
message.module-name
message-module-name
MESSAGE_MODULE_NAME
같음.

스캔순서1

스캔순서2 ???맞나?
application.yaml
application.yml
application.properties

profile
application.yaml
application-dev.yaml
application-prd.yaml
application-local.yaml

amqp, jms

redis

webstocet
* sockJS
* STOMP

SpringBootActuator

spring-boot-starter-actuator
HATEOS – org.springframework.hateoas:spring-hateoas

endpoints

/actuator
/autoconfig
/beans
/configprops
/docs – org.springframework.boot:spring-boot-actuator-docs
/dump –
/env
/flyway
/info
/liquibase
/logfile
/metrics
/mappings
/shutdown
/trace
/health

docker 연동. gradle, maven plugin

Java -> Kotlin 전환시 발생하는 문제들 + 안좋은점

JPA모델설계시

Java에서는 @OneToOne Many등 표시안하고 그냥써도 됐는데.. Kotlin에서는 오류가 난다.

kotlin data class constructor

생성자 만드는게 몹시 짜증이난다다
써보니 이름이 왜 꼬출린인지 알겠다

자동완성이 구리다

자바개발에서 귀찮은 getter, setter, slf4j은 lombok으로 처리해서 귀찮은 자바의 단점이었던 난잡한 코드 문제가 많이 해결됐는데

변수 선언에서 자동완성이 좀 안된다.

 

java는 클래스명을 쓰면 변수명이 자동으로 나올 수 있는데
Kotlin은 … 그게안된다.

커뮤니티에 엉터리가 많다

아직 초보자들이 많은지 잘못된 정보가 간혹 있다.
JPA Entity설계할 때 dataclass를 사용하라고 한다던가 하는…
해보니까 그냥 class로 선언하는게 편하다.
아닌가?? 더 익숙해지면 data class가 더 나을까?

QueryDSL 미지원

QueryDSL에서는 Gradle을 공식적으로 지원하지 않는건가?
github에 가보니 maven만 있고 Gradle은 안 보인다.
third party를 이용해서 하긴했는데…
Kotlin은 변환이 안된다. (이것은 아직 지원안되는 것 같다)
결국 Entity는 Java로 다시 변환했다.

Java와 혼용시 문제

Java와 Kotlin을 같은 프로젝트에 섞어서 쓰면 kotlin에서 lombok의 getter, setter이 인식되지 않는다. (컴파일 타임의 문제니까 노력하지말자 – lombokforkotlin을 만들게 아니라면)
멀티모듈로 하면 상위 코드의 core를 조회 가능
groovy가 더 잘 섞이는 것 같다. 테스트코드 짤 때 써볼라고하니까

결론

꽤 안정화됐지만 그래도 아직 갈길이 멀었다.
아직 한창 개발중인 언어로, 언어 자체의 문제로 인한 버그가 간혹 존재한다.
그리고 현재의 문법체계가 언제까지 유지될거라고 보기도 힘들다.
IDE, 프레임워크, 라이브러리 지원도 아직은 Java를 대체할 수준은 아니다.

가장 오류없이 무난한 개발을 하려면 Maven-Java

좀 고생을 하더라도 다른거 써보고 싶으면 다른거 쓰면 될 것 같다.

Java Template 엔진 – Layout

JSP include

엔진이라고 할건없지만…

구성 잘 잡아놓고 쓰면 tiles나 sitemesh 못지않다.

 

Sitemesh

레이아웃을 잡고 콘텐츠만 바꿔먹을 때 써먹기 좋다.

그런데… 프로젝트 할 때 마다 이것저것 써보자 써보자 하는것도 아니고…

우선순위에서 밀리다 보니 안쓰게 된다.

 

Tiles

주로 사용하긴하는데…

좋은지는 잘 모르겠다.

다른 쓸게 없어서 쓴다는 정도 느낌

ignore=true 옵션을 켜놔도 스텍트레이스가 계속 올라오는건 짜증이 난다.

이 부분을 소스코드 안쪽에 박아놔가지고 고작 이거하나고치자고 jar새로 만들기도 귀찮고 해서 그냥 쓰긴하는데

이것 말고도 캐싱할 파일이랑 아닌부분이랑 구분도 좀 되면 좋겠고 한데

별로 더 발전시킬 생각은 없는 듯 하다.

너무 복잡해지면 쓰기도 힘들어질테니

 

 

Jrebel, JAVA 웹개발자에게 정말 필수!!

Java 웹개발할 때 WAS를 재시작하지 않고도 코드가 적용된다니~
우와 굉장한 기술이다!!

근데…
이걸 왜 써야하나?

다른 주류 웹 언어들은 코드 변경하면 다 바로바로 적용된다.

많이 사용하는 다음의 언어들은 말할것도 없고
PHP, node-js, Ruby(on Rails), Python(on Django?)

JVM 계열인 Scala(SBT)도.. 소스변경 컴파일 하면 변경사항이 바로 적용된다고 하는데…

JAVA만… 300달러 정도 하다가 475달러로 가격을 인상한… JRebel같은 툴을 써야만 HotSwap이 가능하다.

그냥 웹개발을 자바로 안하면 될 것 아닌가?
그래서 안하려고 한다.
(SI업무라면은 할 수 없겠지만.. )
자바가 C,C++에 비해서는 생산성이 높은 언어였지만, Scala, Clojure, Python 등등에 비하면 아니기도 하니까

 

web.xml 버전별로 정리

를 하려고 했지만…. 최근것만

4.0

은 언제 나오나

 

3.1

 

3.0

 

Gradle을 왜 써야하나

그래들.. Ant/Maven/Ivy 등 자바의 다양한 빌드 툴중 하나 정도…

Java를 주로 쓰고 Groovy를 보조로 그리고 요즘 Scala를 살짝 보려고 하고 있는데… 순수 Java개발이라면 상관없지만 복합적인 프로젝트를 만들려면 Gradle이 필수적이다.
(Maven으로 해도 되긴 하는데..  예전에 시도했을 때는 groovy의 특정 버전이 안먹힌다던가 하는 문제가 있었다)

scala는 또 따로 sbt가 있긴하던데… 비슷한 기술들을 이것저것 익힐 필요는 없을 것 같고 조금 더 많이 사용하는 Gradle을 쓰는게 낫지 않을까 호환성 측면에서도
gradle vs sbt 참고자료 : http://stackoverflow.com/questions/11061938/comparing-sbt-and-gradle
요약하면 sbt는 ivy기반이고 snapshot 라이브러리(버전을 중복해서 막 배포하는 라이브러리)에 대응하지 못한다는 것.(인것같다)

개인적으로는 네이티브 자바 라이브러리 개발 및 배포 상황에서 메이븐 셋팅을 다 갖춰놓았기 때문에 이 부분까지 Gradle로 대체할 생각은 없고 java groovy scala를 복합적으로 적용해야 하는 상황에만 사용할 예정이다.

 

Gradle관련 공부하면서 본 책

[도서]엔터프라이즈 자동화를 위한 그래들
여태껏 Gradle 셋팅을 튜토리얼만 찾아보면서 배워가지고
좀 더 구석구석 공부하려고 책을 봤는데
튜토리얼이 다인 것 같다.
한글로 읽어서 편하고 빠르게 이해할 수 있다는 점에서 만오천원 정도 쓸 가치는 있다.
번역서도 아니고 저자가 직접 저술한 책이라 어설픈 번역투도 없어서 이해도 더 잘된다.

 

Gradle을 왜 써야하나

Gradle이 대세이고 지금 기능도 제일 좋은 것 같다.
다른걸 잘 써 왔고 사용하려는 기능이 다 제공된다면 굳이 바꿔야할 필요가 없지만, 배워놓을 필요는 있는 것 같다.
처음 배운다면 Java/Scala/Groovy 뭘 하던 Gradle.

Gradle 참고자료

Gradle 공식 소스코드
https://github.com/gradle/gradle
Gradle 공식홈페이지

Gradle l Modern Open-Source Enterprise Build Automation


groovy 테스트 라이브러리
https://github.com/spockframework/spock-example

JAVA – Serializable

Serializable은 왜 사용하는가?

자바의 직렬화 기능을 사용하는 객체를 명시적으로 알려준다. 이것을 안쓰면 직렬화가 안된다.
라고 알고 있었는데

이 기회에 알아보려고 좀 찾아봤다.

 

 

기존에는이 객체는 데이터 오브젝트이다 라는 것을 명시하기 위해 사용했었다.
ajax, rest api 등등에 사용하는 DTO(VO..) 객체에 그냥 붙였다. gson/jackson을 이용한 serialization에는 필수적이지는 않지만 그냥 확실히 표시 해 주기 위해서..
AjaxWrapper<T extends Serializable> 을 명시해서 Serializable가 선언된 DTO만 들어올 수 있도록

이경우 MAP을 사용할 수 없지만 -> 이 설계를 잡을 때 명시적인 도메인을 쓰고 map을 쓰지 않는게 원래 목표였으니 잘된건가?

 

Serializable 인터페이스에 대해 알아보기 위해.. 먼저 

Serialization하고 붙어다니는 serialVersionUID
이게 선언되어 있지 않으면 jvm에서 자동으로 생성을 한다고 한다.
http://docs.oracle.com/javase/6/docs/platform/serialization/spec/class.html#4100

The stream-unique identifier is a 64-bit hash of the class name, interface class names, methods, and fields. The value must be declared in all versions of a class except the first. It may be declared in the original class but is not required. The value is fixed for all compatible classes. If the SUID is not declared for a class, the value defaults to the hash for that class. The serialVersionUID for dynamic proxy classes and enum types always have the value 0L. Array classes cannot declare an explicit serialVersionUID, so they always have the default computed value, but the requirement for matching serialVersionUID values is waived for array classes.

영어로 서너번 읽은 것 같은데.. 정확히 이해가 안간다.
첫번째 생성한 클래스.. 변경이 없었다면 0L이 기본으로 셋팅이 될테니 꼭 선언을 할 필요가 없다는것 같다.
클래스에 변경이 있었다면 구버전과 비교를 위해 이 넘버를 명시하는게 필수적이 된다는 거시다.(아마도)

 

Serializable에 대단한 기능이나 의미가 있는 것은 아닌 것 같다.
그냥 JVM에서 제공하는 직렬화를 사용한다고 명시하는 것. JVM에서 기본적으로 제공하는 직렬화/역직렬화 기능을 쓸 때 필수적이고, 내가 예전에 썼던것처럼 그냥 json으로 변환할 오브젝트에다가도 대충 갖다가 써또 되지 않을까 싶다. 그래서 계속 쓰던대로 쓰면 될 것 같다.

 

샘플코드를 작성한다면

Book(v0.1) without uid
Book(v0.2) without uid

Book(v0.1) with uid 1
Book(v0.2) with uid 2

Book(v0.1) without uid
Book(v0.2) with uid 2

이렇게 해서 비교해보면 될 것 같다

이건 간략예제

 

[ERROR] DB 커넥션이 알 수 없는 이유로 닫히는 경우

 

단순한 실수로 발생할 확률이 높고 의외로 해결에 시간이 오래 걸린다.

내 코드가 잘못됐다고 생각하지 않고 보통 다른데서 문제를 찾다보니 한참 걸린다.

 

이건 보통 transaction이나 connection close를 적절한 곳에서 해 주지 않아서 발생한다.

아마도…. 다른 이유였다면 검색하면서 시간 버리지 않고 금방 해결했을거다.

 

여태까지 여러 삽질을 해왔는데…
라이브러리의 문제로 오류가 발생했던 경험이 두어번정도 있었고 나머지는 다 내 코드 문제였다.

avro 자바-파이썬 에서 숫자자료형길이 호환안되는 문제 : 파이썬은 숫자자료형길이가 무제한

닷넷에서 뭐였는데… 스텍오버플로우에서 그거 닷넷버그라고 회피해서 사용하는법을 알려줬던 것 같다.

아 그리고… 오라클은 좀 많았던것같다.  아예 먹통은 아니고 의존성 문제였지만(문제있는 라이브러리는 패치를 하던가 삭제를 하던가.. 다운받게 공개를 해놔가지고)

 

몇년이나 일하면서 서너번이면 많지는 않으니