01-1 프로그레시브 웹앱이 뭐예요?

 

PWA : progressive web app

 

네이티브앱 : SDK로 개발(안드로이드 스튜디오 : 자바 / 엑스코드 : 오브젝트C, 스위프트)
 - 운영체제 별 서비스 개발 : 안드로이드, IOS

 - 배포 : 앱스토어(애플), 플레이 스토어(구글)

 - 사용 : 스토어에서 다운로드하여 설치 (설치후 알림등의 다양한 기능 활용)

 > 네이티브앱 장단점 비교표

 

모바일 웹앱 : 모바일 베이스의 네이티브 앱

 - 웹 영역은 HTML5, CSS3, Javascript로 구현

 - 웹 영역은 스토어 배포 없이 서버의 컨텐츠 교체 만으로 최신기능 적용

 - 인터넷 속도 영향, 네이티브앱에 비해 제한된 기능

 > 모바일 웹앱 장단점 비교표

 

하이브리드 앱 : 네이티브앱과 모바일 웹앱의 장단점 활용 

 - 컨텐츠를 웹앱으로 제작 후 네이티브앱으로 변환하여 배포
 > 웹앱 방식의 개발, 네이트브 앱 방식의 배포
 - 제한적인 네이티브 앱 기능 사용
 - 크로스 플랫폼(아파치 코르도바 - 오픈소스)을 이용한 운영체제 별 네이트앱 배포

 > 하이브리드 앱 장단점 비교표

 

프로그래시브 웹(PWA) : 웹의 장점을 유지하며 네이티브 앱의 장점 활용 ? 하이브리드?
 - 하이브리드는 네이티브로 웹앱 컨텐츠를 패킹하고, 네이티브로 HW 기능을 구현하는 서비스

 - PWA는 네이티브가 아닌 API로 네이티브가 제공하는 HW 기능을 구현하는 서비스
 > 프로그래시브 웹앱 장단점 비교표 


01-2 프로그레시브 웹앱을 대표하는 6가지 핵심 기술

 - 필수 : 서비스워커, 웹앱 매니페스트, HTTPS
 - 확장 : 푸시알림, 홈화면 추가, 웹API

 

1. 서비스워커
 - 웹브라우저 내부에서 웹페이지와 독립적으로 백그라운드 실행
 - 브라우저와 서버 사이에서 상태 모니터링, 푸시알림 지원

 - 오프라인 동작 (인터넷 연결상태와 독립된 서비스 제공)

 

2. 웹앱 매니페스트
 - 앱 소개정보(메타데이터) 제공 (JSON) : manifest.json
 - 매니페스트 : 앱에서 사용하던 기능 - 브라우저에 정보제공

 

3. HTTPS (hypertext fransfer protocol over secure soket layer)
 - 보안을 강화한 웹 통신 규약 : 네트워크 영역에서 통신정보가 노출되어도 보안유지
  (전자상거래 등 보안이 중요한 서비스에 적합)
 > 서비스워커를 이용한 PWA 배포에 필수
 > PWA 성능평가 프로그램(라이트하우스 - lighthouse)에 인증받기위한 의무요소
 > 홈화면 추가 기능은 HTTPS에서만 지원

 

4. 푸시알림
 - 사용자에 알림정보 제공
 > PWA 푸시알림 동의 시 : 사이트 이탈 사용자, PWA가 종료된 백그라운드 상태에도 알림 가능

 

5. 홈화면 추가(add to home screen - 모바일) - 옴니박스(omnibox - 데스크톱) : 설치 (즐겨찾기, 바로가기 아님)

 - 웹 브라우저 사용 시 PWA 설치 안내
 > 운영체제에서 앱으로 인식
 - 홈화면 추가 제안 조건 :
 > HTTPS 접속 : PWA 호스팅 의무요소

 > 매니페스트 등록 : short_name, name, icons(192px X 512px), start_url, display( : fullscreen || standalone || minimal-ui)
 > 서비스 워커 설치 : 브라우저에 서비스워커 설치 의무

 > PWA 설치여부 : 해당 PWA 서비스가 이전에 설치되지 않은 상태
 - 설치된 아이콘은 네이티브 앱과 동일함

 

6. 웹 API

 - javascript api 사용 :  웹사이트, 웹앱, PWA 사용 (네이티브 기능을 지원하기 시작 : 위치정보, 카메라 등)

 

* 스타벅스의 PWA

 - 인터넷 접속 제한환경 극복 : 오프라인 지원

 - 멀티플렛폼 범용 POS(point of sale) 시스템 구축

 - 가볍고 빠른 반응속도

 

* PWA 사용자경험

 - 온라인, 오프라인을 아우르는 신뢰성

 - 네이티브 앱에 비해 쉬운 설치 지원
 - HTTPS를 의무 적용한 보안성
 - 알림을 통한 구독자 관리
 - 멀티 플랫폼 지원

 - 검색노출에 따른 확장성

 - 최신 서비스 제공이 가능 신속성

 - 네이티브 앱과 같이 HW 기능도 사용 가능

 - 네이티브 앱 대비 빠른 배포, 실행, 반응속도


01-3 비주얼 스튜디오 코드 설치하기

 

* 회사 보안 이슈로 VsCode 사용 불가

 - ecilpse로 대체해 보자.
 > 라이브서버 기능은 어떻게 대체하지... 

 

회사에서도 함께 진행했으면 하여 eclipse에서 live server를 실행해볼까 싶어 찾아봤지만,
관련 기능을 제공하는 플러그인이 없는 듯 하다.
eclipse 버전차이로 webclipse는 지원하지 않는 듯 하고, Tern Eclipse 로 대용하던게 있던것 같은데, javascirpt 관련 기능을 목적으로 쓰인 것이었던지...  codemix는 또 뭐냐... 어지럽다. 일단 그냥 집에서 vsCode로 해보자.
보안팀을 졸라볼까 ㅋ

01-4 '안녕하세요' 예제 만들기

 

index.html 파일만들고

코드생성기능으로 html 5 템플릿 코드를 생성한 뒤

 

언어 설정과 셈플텍스트 입력해주고

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>안녕하세요!</h1>
</body>
</html>

라이브서버를 실행해주면

엑세스허용 메시지를 확인하는 것으로 

크롬에 작성한 화면이 나온다.

디버그 모드에서 

디바이스 툴바 토글버튼으로 웹에서 모바일 모드로 전환하고

 

 

디바이스 목록에서 아이폰 6/7/8을 선택해 주면

show device frame 속성 선택시 프레임이 표시된다.

vscode의 상태 표시줄에 port:5500 영역을 클릭하면,

live server가 종료되면서 Go Live 버튼으로 변경된다.

다시 Go Live 버튼을 클릭하면 live server가 시작된다.

 

eclipse에서 live server 시도하다가 시간만 보냈.. ㅋ
어찌어찌하여 1장은 봤는데, 생각보다 시간이 좀 걸리네... 어쩌지...

 

 

 

AS : code-design.web.app@gmail.com / https://code-design.web.app/

* Do it! 스터디룸 카페 : https://cafe.naver.com/doitstudyroom

* Do it! 공부단 정보 :  https://cafe.naver.com/doitstudyroom/6325

 - 신청 : https://cafe.naver.com/doitstudyroom/43619

 

[Do it! 프로그레시브 웹앱 만들기] 공부단 신청합니다.

Do it! 프로그레시브 웹앱 만들기반응형 웹 개발부터 하이브리드 앱 배포까지 PWA 완전 정복! https://search.shopping.naver.com/book/cat...

cafe.naver.com

 

 

어제 정상조회되던 서비스에 오류가 났다.

Error attempting to apply AttributeConverter

{"MAASLOG"="[2022-10-24 15:08:21][ERROR][http-nio-8082-exec-8][BatchErrorCollectService.java:65][inquiryList:Error attempting to apply AttributeConverter]"} javax.persistence.PersistenceException: Error attempting to apply AttributeConverter at org.hibernate.type.descriptor.converter.AttributeConverterSqlTypeDescriptorAdapter$2.doConversion(AttributeConverterSqlTypeDescriptorAdapter.java:148) at org.hibernate.type.descriptor.converter.AttributeConverterSqlTypeDescriptorAdapter$2.extract(AttributeConverterSqlTypeDescriptorAdapter.java:121) at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257) at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253) at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:243) at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:329) at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:3130) at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1869) at org.hibernate.loader.Loader.hydrateEntityState(Loader.java:1797) at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1770) at org.hibernate.loader.Loader.getRow(Loader.java:1622) at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:740) at org.hibernate.loader.Loader.getRowsFromResultSet(Loader.java:1039) at org.hibernate.loader.Loader.processResultSet(Loader.java:990) at org.hibernate.loader.Loader.doQuery(Loader.java:959) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349) at org.hibernate.loader.Loader.doList(Loader.java:2849) at org.hibernate.loader.Loader.doList(Loader.java:2831) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2663) at org.hibernate.loader.Loader.list(Loader.java:2658) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:506) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:400) at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1414) at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1625) at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1593) at org.hibernate.query.Query.getResultList(Query.java:165) at com.querydsl.jpa.impl.AbstractJPAQuery.getResultList(AbstractJPAQuery.java:160) at com.querydsl.jpa.impl.AbstractJPAQuery.fetch(AbstractJPAQuery.java:202) at com.sejong.mwserver.service.admin.BatchErrorCollectService.inquiryList(BatchErrorCollectService.java:52) at com.sejong.mwserver.service.admin.BatchErrorCollectService$$FastClassBySpringCGLIB$$c7f78cc1.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) at com.sejong.mwserver.service.admin.BatchErrorCollectService$$EnhancerBySpringCGLIB$$2d72030a.inquiryList(<generated>) at com.sejong.mwserver.controller.admin.BatchErrorCollectController.inquiryList(BatchErrorCollectController.java:51) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) at com.sejong.mwserver.security.JwtRequestFilter.doFilterInternal(JwtRequestFilter.java:66) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at argo.server.valves.LenaStuckThreadDetectionValve.invoke(LenaStuckThreadDetectionValve.java:226) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.IllegalArgumentException: Unsupported type for 04 at com.sejong.mwserver.entity.code.AbstractBaseEnumConverter.lambda$1(AbstractBaseEnumConverter.java:32) at java.util.Optional.orElseThrow(Optional.java:290) at com.sejong.mwserver.entity.code.AbstractBaseEnumConverter.convertToEntityAttribute(AbstractBaseEnumConverter.java:32) at com.sejong.mwserver.entity.code.AbstractBaseEnumConverter.convertToEntityAttribute(AbstractBaseEnumConverter.java:1) at org.hibernate.metamodel.model.convert.internal.JpaAttributeConverterImpl.toDomainValue(JpaAttributeConverterImpl.java:45) at org.hibernate.type.descriptor.converter.AttributeConverterSqlTypeDescriptorAdapter$2.doConversion(AttributeConverterSqlTypeDescriptorAdapter.java:140) ... 138 common frames omitted

아래와 같이 convertor 를 적용하고 있었다.

아마 enum에 정의되지 않은 값이 DB에 등록되어 발생한 것 같다.

@Getter
@AllArgsConstructor
//@EnumCodeAnnotation(name = "AFFI_CLSS_CD")
public enum MistkProsStatCd implements BaseEnumCode<String> {

	오류발생("01"),
	오류아님("10"),
	조치중("20"),
	조치완료("30"),
	보류("40")
	;
	
	private final String value;
	
	private String value() {
		return value;
	}
	
	private static final Map<String, MistkProsStatCd> BY_VALUE =
            Stream.of(values()).collect(Collectors.toMap(MistkProsStatCd::value, e -> e));
	
	public static MistkProsStatCd getEnumByValue(String value) {
		return BY_VALUE.get(value);
	}
}

@Converter(autoApply = true)
public class MistkActnStatCdConverter extends AbstractBaseEnumConverter<MistkActnStatCd, String>{

	@Override
	protected MistkActnStatCd[] getValueList() {
		return MistkActnStatCd.values();
	}

}

오류 부위는 아래의 IllegalArgumentException throw로 발생했다

public abstract class AbstractBaseEnumConverter<X extends Enum<X> & BaseEnumCode<Y>, Y> 
														implements AttributeConverter<X, Y>{

	protected abstract X[] getValueList();
	
	@Override
	public Y convertToDatabaseColumn(X attribute) {
		
		if(attribute == null) {
			return null;
		}
		
		return attribute.getValue();
	}
	
	@Override
	public X convertToEntityAttribute(Y dbData) {
		
		if(dbData == null) {
			return null;
		}
		
		return Arrays.stream(getValueList())
					 .filter(e -> e.getValue().equals(dbData))
					 .findFirst()
					 .orElseThrow(() -> new IllegalArgumentException(String.format("Unsupported type for %s", dbData)))
					 ;
	}
}

DB에 04가 있는데 매핑을 뭐로 하라고!!! 
미안하다. DB 내가 안넣었다. 확인해볼께.

'tools' 카테고리의 다른 글

ecilpse 속도 개선  (1) 2023.09.12
vsCode git pull request  (0) 2023.04.16
git. push가 갑자기 안되네.. github가 잘못했네.  (0) 2021.10.15
VSCode Workspace Trust?  (0) 2021.08.27
Visual Studio Code  (0) 2021.06.20

+ Recent posts