Category Archives: 개발코딩

SpringWebFlow – 왜 쓰나 어떨 때 쓸까

이걸왜쓰나

이 프레임워크의 존재는 오래전부터 알았지만 이걸 쓸 생각은 한번도 안해봤다.

그냥 별로 쓸모가 없어보여서… 이런짓을 왜 해야되나 싶었다.

그냥 controller에서 리다이렉트하고 뭐 하면 되는데

 

그런데 최근.. SSO서비스를 만들면서 플로우가 너무 꼬여서 고생하고 나니 생각이 바뀌었다.

소셜로그인 때문에 OAuth의 redirect까지 끼어들고 나니 코드가 뭐가뭔지 정신이 하나도 없었다.

그래서 사용하기로 결정.

사용법은 매우 쉽다. 웹 플로우의 필요성을 느꼈다면 설명은 필요없어보인다.

 

장단점

아쉬운점은 xml이고 spring boot에서 별로 지원이 없다는 점.

아직 쓸모가 있고 수요도 있는데

업그레이드는 되지 않는 것 같다.

SpringBoot에서 참견을 안하니까 알수없는 오류의 구렁텅이에 빠지는 일도 없고

심플하고 오래된 프레임워크라 버그가 없을 것만같다. (아직 안써봤다)

 

활용 시나리오

ex0) SignupFlow

로그인-> Y -> end.메인화면으로.view

-> N -> 회원가입폼.view -> email? -> EmailFlow

-> social? -> SocialFlow

ex1) EmailFlow

~~~

ex2) SocialFlow

~~~

 

문제점

적용하면서 시간낭비 하다가 다 빼버렸다.

쓴다면 플로우가(Scene이?) 3단계 이상인 경우에만 쓰는게 좋을 것 같다.

 

나갔다가 돌아오는 경우에 사용할 수 없다.

ex)이메일인증, OAuth 등의 경우

RequestParam, Cookie 또는 Session을 선택적으로 쓸 수 있는 환경이 필요해 보인다.

XML설정이 매우 불편하다.

시간날 때 GroovyDSL 형태로 만들어보는게 좋을까

중간진입 불가

flow는 항상 처음부터 시작되는걸로 여러개 만드는 방식도 좋지만

중간진입이 필요한 경우도 있지 않을까? 이건 좀 애매한 부분.

Form-Post방식의 화면전환

_elementId_{name} 형태로 써서 보내야 되는데

오지게 불편하다.

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

인코딩 지옥탈출 가이드

깨지는 모양으로 인코딩 판별하기

이미지는 생각나면 추가

가오리 : EUC-KR을 UTF-8로 인식하고 열면

수식 : UTF-LATIN1 으로 인식하고 열면

외계어 :

쫩쫠뻴 : utf를 EUC로 인식하고 열면

참고

한글 인코딩의 역사

http://blog.daum.net/_blog/BlogTypeView.do?blogid=0LMWJ&articleno=8181316

http://blog.daum.net/_blog/BlogTypeView.do?blogid=0LMWJ&articleno=8181317

한글 인코딩 – 개념

https://ko.wikipedia.org/wiki/%ED%95%9C%EA%B8%80_%EC%99%84%EC%84%B1%ED%98%95_%EC%9D%B8%EC%BD%94%EB%94%A9

https://namu.wiki/w/%ED%95%9C%EA%B8%80%20%EC%9D%B8%EC%BD%94%EB%94%A9

http://d2.naver.com/helloworld/19187

http://studyforus.tistory.com/167

http://mwultong.blogspot.com/2006/12/hwp-unicode-utf-8.html

https://ko.wikipedia.org/wiki/UTF-8

http://ssaemo.tistory.com/28

https://encoder.mattiasgeniar.be/index.php

https://docs.python.org/3/howto/unicode.html#encodings

코드

어디거 퍼온거 합쳐놓은거

 

[소프트웨어] Kotlin+Java-SpringBoot 프로젝트 진행 후기

프로젝트라고 할 수준은 아니고 새로 만드는 마이크로 서비스에 꼬출린을 적용하다가 겪은 일들

사용기술 키워드

Java,Kotlin,SpringBoot,JPA,QueryDSL,RESTful API

문제상황

문법

TypeScript,Swift,Kotlin 문법이 상당히 비슷하다.

세개 언어의 합병은 불가능할까?

Reflection, Ananotation

JVM언어라 최종적으로 동일한 바이트코드가 나오는거니까 리플렉션도 동일한 형태로 나오겠지 생각했는데 아니었나보다.

리플렉션이 필요한 부분에서 오류가 나는 것 같다.

QueryDsl, jackson, Lombok(은좀다르지만)

 

생성자 선언

이건 좀 다른데.. 그냥 언어에 익숙하지 않아서 그런면도 있고

되게 편한것처럼 써있던데 막상 써보면

문법이 그리 편하지는 않다.

Lombok

Java와 혼용시 lombok 적용이 안된다.

컴파일타임 문제때문에…

같은 모듈에서 Java+Kotlin을 쓰는경우 오류가 난다.

해결방법은…(회피방법은?)

core<–web

core에 Java를 쓰고 web의 kotlin에서 가져다 쓰는건 가능하다.

근데 왜 쓰나?

그냥 한 번 써볼라고

그리고 아직 많이는 안 써봤찌만 쓰다보니 언어 자체가 조금 심플함이 좀 있다.

SSO(SingleSignOn) – Solution vs 직접개발

개요

요즘엔.. SSO 관련 개발은 거의 필수인데
막상개발하려면 여기저기 다 있는거 또 만드는 것 같은 생각이 들지만…
오픈소스나 뭐 갖다 쓰려고 하면 또 마땅한게 없다.

대안

OpenSource

JOSSO : 설치하면 실행된다. 쉽게 사용은 가능한데 커스터마이징도 쉬울까가 고민..
CAS : 코드가 매우 복잡.. 잘 이해가 안간다. 새로 만드는게 더 빠르지 않을까? 그냥 실행되는것도 아니라서 갖다쓰기도 편하지 않다.

상용Commercial

직접개발

관련기술

SAML : 삼를.. 잘 모르겠다.
http://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_roles_providers_saml.html
OAuth : 오앗. 토큰받아다가 쓰는거. 많이 쓰니까 설명생략
GlobalCookie : 여러서버에서 동일한 네임의 쿠키를 바라본다. auth서버를 호출해야겠지
IP : 접속주소
MacAddress : 랜카드 주소기반
LDAP : 디렉토리 서비스 계층형으로 권한을 저장하는방식??/정도로 알고있는데..
Token : Stateless 호출에 사용. API에 많이 사용됨
등등…
다 지원되면 좋겠지만 다 하기는 힘들고 필요한것만 사용하는게 좋다.

~~~~~

위의 기술을 그대로 구현할수도 있고.. 유사하게 구현할수도 있고..라이브러리를 갖다쓸 수도 있고

이전에 쓸 때는 OAuth서버를 구현하고 OAuth(Like)방식으로 내부 SSO를 구현했는데…
좀 개선해보려면 어떻게 하는게 좋을지

Thymleaf 적용중 만난 오류들

템플릿 소스 가지고 쓰는데…

`

Thymleaf 되게 엄격하군.

쓸데없을 정도로..

안써야겠다 역시.

CQRS와 EventSourcing 기술을 보고

CQRS와 EventSourcing제대로 이해를 했나 모르겠는데

비슷한 생각을 하고 그런 설계를 잡으려고 했었는데,
당시에는 Hibernate ORM Envers라는게 있는줄 몰라서…
그 때의 설계는
ORM을 이용한 도메인 설계를 그대로 화면에 보여줄 수 있도록 하고 히스토리는 별도로 저장하는 구조였다.

)를 들어 회원정보 엔티티에서
level 변동, password 변경 등에 대한 히스토리 저장이 필요하다.

RDBMS에서는 다음 엔티티의 현재상태만 저장

UserEntity {
username : string
password : string
passwordChangeDate : date
email : ref EmailEntity
level : type { bronze, silver, gold, platinum, diamond, challenger }
lastLoginDate : date
}

로그는 별도 디비 또는 파일로 관리.
user-password-change-history (password, passwordChangeDate)
user-level-change-history
user-lastLoginDate-history

이런방식으로 현재상태와 변경상태를 저장한다.
변경히스토리를 저장하는 부분을 하나하나코딩하면 안되고,
하이버네이트 인터셉터라던가 해서 데이터변경을 확인하고 로그를 남기도록 하는 추가기능이 필요하다.

이렇게 하는 경우 RDBMS의 데이터가 메인이기 때문에 변경기록이 남지 않게 되는 상황이 생길수도 있다. 중요한 데이터는 트랜잭션을 걸면 느려
계좌 밸런스를 저장하는걸 예로들걸 그랬나

지금 CQRS컨셉으로 제시하는 것을 보면 현재상태는 메모리디비같은데 저장하는 것 같은데 소규모시스템에서 생각 해 보면
RDBMS에 현재상태를 몽땅저장하는게 괜찮아보인다.

이정도로 중규모까지는 사용가능 해 보인다.

RDBMS의 업데이트를 과도하게 사용하는 부분이 문제가 되긴 할텐데…

어쨌든.. envers쓰면 쉽게 된다.
http://hibernate.org/orm/envers/
….
잘도 만들어 놨다. 이걸 왜 못찾았을까 좀만 더 찾아볼걸

MS의 Cloud Design Pattern 24선. (CQRS, EventSourcing … etc)

원문 링크 : https://docs.microsoft.com/en-us/azure/architecture/patterns/

MS에서 발표한 Cloud 에서 적용하면 좋은 디자인 패턴

(for Azure, 다른 Cloud도 가능)

그중에서 요즘 관심을 끄는것은 CQRS와 EventSourcing
정확히 이해는 못했는데

DDD구현의 문제를 해결
CRUD가 분산환경에서 갖는 문제점(고가용성 서버한계)
때문에 나왔다.

아주 간단히 하면 이정도인듯 하다.
StreamData처리하는것과 비슷한건가 좀 더 봐야할 것 같고.

구글에서 CQRS로 검색하면 한글로 번역된 문서도 좀 있다.

[번역] 최신 기술 – CQRS 처음 도입하기

시간이 되면 원문을…

Command Query Responsibility Segregation
https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs

https://docs.microsoft.com/en-us/azure/architecture/patterns/event-sourcing

프레임워크도 나와있다

Axon : www.axonframework.org

Reveno : reveno.org

Eventuate : eventuate.io

Lagom : www.lagomframework.com

다들 쉽고 빠르고 분산가능하다고 써있는데 안써봤다.

기타 참고할만한 문서

Introduction to Domain Driven Design, CQRS and Event Sourcing

Java Template 엔진 – 텍스트

JSP – jstl

www가 html을 쓴다면,  jsp도 계속 쓴다
협업시 jsp를 쓴다면 깔끔한 코딩은 신경쓰지 말자
쑤셔넣어서 개발하기좋고 보통 그렇게 사용된다

Thymleaf

이메일 템플릿 용도로 써봤는데
잘 만들어놓으면 퍼블리셔가 자꾸 망쳐놓는다.
문법이 어려우니까…
디자이너 퍼블리셔 개발자 협업해서 쓰라고 만든 것 아닌가?
이정도면 용도폐기 수준.

다시는 쓸 생각이 없다.

Velocity

jstl에서 꺽쇠 쓰는걸 샵으로 대체하는 정도
그만 만들고 다른 생산적인 일을 했으면 좋겠다.

Freemarker

Velocity와 또 다른 끔찍한 혼종
뷰 코드에 베이직형태의 코드를 짜집어 넣고싶어 환장한 사람이 있다면 추천
아니라면 이걸 쓸 필요는 없지 않을까

Mustache

jquery tmpl 하고 비슷한 방식을 사용한다.
익히기 쉽고 사용도 쉽다.
눈에띄는 단점은 없는데 실제 프로젝트에 적용 해 보지 않아서 아직 뭐라 말을 못하겠다.
간단한 페이지에 적용 해 볼 의향이 있는 정도

Jade

노드랑 ㄷ장고 프로젝트 만질 때 좀 썼었는데
좋지도 나쁘지도 않았다.
익숙하지 않아서 그런지 모르겠지만 탭강간이 심각했다
탭이 대여섯개 넘어가면 파일을 나눈다거나 하는 별도의 노력이 필요하지 싶다.
자바용으로도 나와있다고 하는데 자바에서는 안 쓸 것 같고
노드 프로젝트 할 때나 써봐야겠다.

결론

은 HTML

결국 HTML을 뽑아낼 방법을 찾는 것들인데

뭐가 더 편할지는 취향차이가 있을 것이라고 생각한다.

물론 완전히 잘못된 선택도 존재한다.

Java Template 엔진 – Layout

JSP include

엔진이라고 할건없지만…

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

 

Sitemesh

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

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

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

 

Tiles

주로 사용하긴하는데…

좋은지는 잘 모르겠다.

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

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

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

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

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

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