Tag Archives: Spring

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} 형태로 써서 보내야 되는데

오지게 불편하다.

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

Spring 5.0에서 바뀌는 점 + Java9에서 바뀌는 점

Java9 대응

따라서, Java9에서의 변화가 Spring5 에서의 변화겠지

JDK7에선 붜가 변했는지 잘 모르고 넘어갔고 <>??
JDK8에선 stream, lambda(람바다?람드아?)가 나왔는데 크게 사용률이 높지 않았다
JDK9에서는 좀 많은 변화가 있는 것 같다

‘ http://blog.takipi.com/5-features-in-java-9-that-will-change-how-you-develop-software-and-2-that-wont/

추가되는 기능

  • repl – jshell (커맨드라인 명령 지원 )
    • 다른 언어에서 지원되는거 보고 부러워하던 기능 아닌가 ㅎ
  • Microbenchmarks(JMH)
    • 벤치마크 기술이라고 하는데…
  • GC 개선
    • G1엔진을 쓴다고 하는데.. 빨라진다고?
  • http2.0
    • 2.0 스펙도 봐야한다.
  • OS컨트롤 능력 강화
    • 예를 들자면 PID 가져오는 기능이라던가

사라지는 기능

그런게 있었나 싶은 기능들 : Json API, Money currency

 

Spring5 추가기능

Mono 되는거 뭐 추가되는 것 같았는데…

DispatcherHandler라는 클래스 중심으로 flow가 추가되는 것 같고…

아직 제대로 안봐서 모르겠다.

 

Spring5 지원중지

Portlet, JDO, JSF 등 공부할 생각도 못했던 몇몇 기술들 지원중단
Hibernate3, 등 구버전 중단.
좀 더 과감해졌으면 좋겠지만…

최근에 Spring재단이 거의 Jaav 표준을 주도하고 있는 것 같아서
조심스러운가보다.

https://spring.io/blog/2015/06/10/feedback-welcome-spring-5-system-requirements

어설프게 몇 줄 읽어봤는데 역시나 댓글에 반발이 조금 있는 것 같다.

Portlet3.0(JSR362)스펙은 2017.Jan에 새로 발표된 것 같은데.. 지원 중단이군 ㅎ
공부할거 하나 줄었다.
왜 필요한가 의문이 좀 있었다. servlet 페이지에 삽입되어서 사용자의 상태를 기억하기도 하고 페이지 일부분의 동적인 변경을 담당하는 기술.. 정도로만 알고 있었는데
오늘 갑자기 protlet 관련 검색하다가 springframework 5.0소스에 portlet 패키지가 없는걸 보고 알게됏다.
DispatcherPortlet
https://en.wikipedia.org/wiki/Java_Portlet_Specification
http://stackoverflow.com/questions/1480528/what-is-the-difference-between-a-portlet-and-a-servlet
몇가지 찾아보니 portlet 기술은 jsp 페이지에 jstl방식으로 fragment를 삽입하는 기술의 일종인 것 같은데
최근에 ajax widget이나 template engine등이 이를 완전히 대체하고 있어서… 굳이 필요한가 싶은 생각이 든다.
그런의도에서 portlet 지원을 중단한게 아닌가….? 싶다.

Spring multipart upload 에러

해결 :

bean 이름을 바꿨다.

spring에서 bean name을 가지고 매핑하니 이름을 정확히 써야한다.

 

오류내용 :

 

 

Spring Data JpaRepository 사용시 주의점. 이름중복. no such method

요즘 잘 기록을 안해놓다보니…

에러로그를 잃어버렸다.

이런 종류의 오류가 발생하는 경우에는 실행 순서에 따라 되다말다 하는 경우가 많아서 원인 찾기가 힘든데

사실 이것도 정확히 해결이라기보다는 원인 비슷한 것을 찾은 상황… 맞음말고 아님또말고다.

오류상황

PageEntity, 그리고 PageRepository extends JpaRepository<PageEntity, Long>

형태로 사용했는데

테스트코드에서는 이상없이 동작하지만… 웹에서 호출을 하면 오류가 발생하는 상황

해결

혹시나 해서…

PageEntityRepository로 변경을 했다.

무슨 에러로그를 보고 이걸 떠올렸었는데…

 

그러니까

네이밍을 중복 안되게 잘하쟈는…

스프링같은 라이브러리에서 네이밍을 할 때 프리픽스를 좀 붙여주면 좋겠다.

SPPageEntity 라던가.. 애플은 NSString이렇게 하는것처럼..

Spring JavaConfig 설정시 null pointer exception 등 알 수 없는 문제발생시

톰캣이 web.xml.bak web.xml.old 등등으로 파일명을 바꿔놔도 검색을 한다.

설정은 확실해야하고 오류상황에는 오류를 뱉아야하는데
어설픈 편의성 제공으로 지옥을 맛보게 해 놨다

말도안되는 오류가 생기고 구글검색도 안되는 경우에는 한줄한줄 디버깅을 해보자

Spring과 관련 라이브러리 비교 – 스프링시큐리티 구조상의 문제점?

스프링 시큐리티는 잘 만들어진 보안 프레임워크이긴한데…

스프링을 A등급이라고하면 시큐리티는  B등급 이상으로 점수를 주긴 싫다. 스프링 소셜은 C등급?

개념적인 부분에서는 좋을지 몰라도 사용자 입장에서는 아쉬운 부분이 많이 보인다. 구조가 직관적으로 이해하기 힘들기도 하고…

 

<http>를 이용해서 설정을 쉽게 해 주는것도 좋지만 이로 인해서 구조 파악과 커스터마이징이 더 힘들어진다.

기본 코드가 너무 데이터베이스를 활용하는데에만 치중되어 있고 구현이 되어 있는 부분이 많다. 인터페이스나 구조정도만 제공되어야 할 것 같은 부분에 데이터베이스를 사용하는 구현체들이 박혀있어서 이를 대체하기가 힘들다. 특히 <http>를 사용하는 경우에는 자동화가 진행 돼 버려서 더 불편해진다.

아니면 내가 제대로 파악하지 못한걸지도…?

어쨌든 이런 부분들 일부를 수정해서 만들어볼 계획.

 

 

SpringSecurity스프링시큐리티 로그인 수동처리 Manually Login

1. 간단하다

콘텍스트 홀더를 불러서 userDetails를 저장해준다. 어차피 시큐리티의 로그인 프로세스는 UserDetails에 필요한 정보를 디비나 기타 등등에서 가져와서 UserDetails구현체를 생성해가지고 시큐리티에서 관리하는 세션에 저장해주는 것이기 때문에… 이걸 간략하게 처리하는 것과 같다.

2. 스텍오버플로우에서 발견했던건데… 잘 안된다.

AuthenticationMAnager에서 인증이 실패한다. 정상적인 로그인 프로세스를 타는 방법이긴 하지만 암호화 되어있는 password를 입력해야하는데 여기서 틀린 것 같다. 맞는 패스워드를 넣는다면 성공할 것 같다. 맞는 것 같으니 테스트는 생략한다.

tiles2 tiles3 변경 적용시 주의점

servlet-context.xml

tiels2 설정

maven버전을 변경하고 여기서 2를 3으로 고치면 에러도 안뜨고 이상이 없어 보이지만…

로딩이 안된다. ClassNotFoundException

아마 이 에러?

이무렇지도 않게 pom.xml을 켜서 의존성 문제를 해결하면 끝.

tiles2 tiles3는 버전이 그냥 올라간게 아니라 거의 라이브러리가 바뀐 수준인 것 같다. 그런데 이름을 유지하고 있다. 하위호환성이 제로면.. 아예 패키지명이라도 바꾸던가 좀..
어쨌든 2.x버전을 3.x로 마이그레이션 할 때 pom에 2.x버전이 남아있게 되면 별별오류가 뜬다. 3.0.5버전부터는 jdk6도 지원을 안한다고 하니 주의.
아직 jdk6쓰는사람 잘 없을 것 같지만…
이것만 주의하면 매우 쉽다. 그냥 servlet-context에서 tiles2 -> tiles3으로 바꿔주면 된다.

Spring-Encache 문제 Another unnamed CacheManager already exists in the same VM

스프링4.x와 jpa, encache를 설정해서 사용. 멀티모듈프로젝트로 포팅하면서 문제가 발생했다.

JavaConfig.java를 복붙하는 과정에서 오류가 있었나 해서 여기저기 찾아봤는데 역시 없었고 빈 생성타임을 의심하고 찾아서 문제점을 발견했다.

component-scan이 JavaConfig.java 설정파일을 두번 읽으면서 빈을 두번생성하고~ 캐시가 두번 생성되면서 발생하는 문제…

servlet에서 스캔을 없애버리거나… servlet이 담당하는 부분만을 스캔하게 만든다. Controller, 또는 Service까지…

root에서는 기타 등등 의존성을 미리 생성해야 하니 이쪽에서 대부분의 스캔을 맡겨놓는다.설정은 다음과 같다.

문제상황

 

해결방법