JPA 를 쓰다가 저런 에러가 발생했다.

찾아보니 Entity에서 @ManyToOne 할때

FetchType을 Lazy로 설정했을 때 발생하는 문제같다.

Lazy 옵션은 필요할 때 조회를 하는 데,

필요가 없으면 조회를 안해서 비어있는 객체를 serializer 하려고 해서 발생되는 문제인것 같다.

해결방법은 3가지가 있다.

1. application 파일에 spring.jackson.serialization.fail-on-empty-beans=false 설정해주기

2. 오류가 나는 엔티티의 LAZY 설정을 EAGER로 바꿔주기

3. 오류가 나는 컬럼에 @JsonIgnore를 설정해주기

나는 2번으로 해결했더니 잘 동작한다.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long uid;
@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name="type_uid")
private Type type;

 

지난 포스팅에 웹뷰를 구현하는 것을 올렸다.

이번 포스팅에서는 웹뷰 설정하는 것을 작성해보겠다.

1 . 세팅 변수 설정

mWebView = findViewById(R.id.webView); // 웹뷰 선언
mWebView.setWebChromeClient(new WebChromeClient()); // 웹 크롬클라이언트를 웹뷰에 설정한다.
mWebSettings = mWebView.getSettings(); // 웹뷰에서 webSettings를 사용할 수 있도록 함.

 

2. 설정 하기

mWebSettings.setJavaScriptEnabled(true); 
//웹뷰에서 javascript를 사용하도록 설정
mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true); 
//window.open() 동작하도록 설정
mWebSettings.setLoadsImagesAutomatically(true);
// 앱에 등록된 이미지를 자동으로 로드하도록 설정
mWebSettings.setUseWideViewPort(true);
// 웹뷰에 wide viewport를 사용하도록 설정함.
mWebSettings.setLoadWithOverviewMode(true);
// 메타 태그 설정
mWebSettings.setDefaultFixedFontSize(14);
// 기본 고정 글꼴 크기
mWebSettings.setSupportZoom(true);
// 화면 줌 기능을 사용할 수 있도록 설정함
mWebSettings.setBuiltInZoomControls(true);
// 화면 확대,축소 사용 여부
mWebSettings.setDisplayZoomControls(true);
// 화면 확대,축소 시 WebView 에서 확대/축소 컨트롤 표시 여부
mWebSettings.setCasheMode(LOAD_NO_CACHE);
// 캐시모드 설정
// LOAD_CACHE_ELSE_NETWORK 기간이 만료돼 캐시를 못 쓸 경우, 네트워크를 사용
// LOAD_CACHE_ONLY 네트웍을 사용하지 않고 캐시로만 사용
// LOAD_DEFAULT 캐시를 사용하고 만료된 경우 네트워크를 사용
// LOAD_NORMAL 기본적인 모드로 캐시를 사용
// LOAD_NO_CACHE 캐시모드를 사용하지 않고, 네트워크를 통해서만 호출
mWebSettings.setDomStorageEnabled(false);
// 로컬 스토리지 사용여부를 묻는 용도로, ex) 팝업창 등을 하루동안 보지않기 기능 사용에 필요함
mWebSettings.setAppCacheEnabled(false);
// 앱 내부 캐시 사용 여부 설정 
mWebSettings.setAllowFileAccess(true);
// 웹뷰내에서 파일 액세스 활성화 여부 
mWebSettings.setUserAgentString(true);
// 앱에서 띄운 웹뷰인지 인지할 수 있도록 설정

더 있는 것 같은 데.. 필요하면 더 추가하도록 하자

'모바일 > Java' 카테고리의 다른 글

[Android] Java WebView 를 구현해보자  (0) 2025.02.13

기존에 플러터로 웹뷰를 구현했지만 크로스플랫폼의 한계 때문인지,

성능이 비 정상적으로 느려터져서 네이티브 플랫폼(자바)으로 바꿨다.

프로젝트 생성은 다 아실테니 생략

1. AndroidManifest.xml 파일 수정

MainActivity 파일에 웹뷰를 진행한다는 가정으로 하겠다.

 
 
android:installLocation="preferExternal" // AVD 매니저 관리용
android:usesCleartextTraffic="true" // 캐시 정리용
<uses-permission android:name="android.permission.INTERNET" />
 // 기기에서 웹브라우저로 접근할 수 있게 허용

바뀐 부분 소스만 붙여넣기 편하게 적어놓는 다.

향후 앱 번들로 출시할 때 잔에러 처리용이다.

2. MainActivity.Java 파일 수정

MainActivity 전체파일

3. Run 버튼으로 실행

앱 실행

Run 으로 실행하면 정상적으로 잘 작동한다.

다음 포스팅에서는 앱번들 출시에 필요한 Key.store 파일을 안드로이드 스튜디오에서

GUI 환경으로 만드는 방법과, App bundle 파일을 만드는 방법을 알아보겠다.

'모바일 > Java' 카테고리의 다른 글

[Android] Web View 세팅하기  (1) 2025.02.13
 

지난 포스팅에서 M1 맥북기준 KeyStore를 만들었다.

이제 KeyStore 설정을 할 차례다.

우선 플러터 프로젝트의 android 폴더 하위에

key.properties 파일을 생성한다. 오타에 주의하자.

key.properties 파일 생성

이제 key.properties 에 이 내용을 채워넣는다.

storePassword 와 keyPassword를 입력하는데, 지난 포스팅에서 입력했던 비밀번호를

동일하게 작성하면 된다.

keyAlias 의 경우 지난 포스팅을 확인해보자 .

이 명령어를 보면 upload 란 이름으로 만들었기에 keyAlias 를 upload 라고 작성한다.

storeFile의 경우 지난 포스팅에서 만들었던 upload-keystore.jks 의 파일 경로를 작성한다.

다음으로 android/app/build.gradle 파일을 수정한다.

android 윗부분에 keystore 프라퍼티를 추가한다.

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
    if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    }

다음으로 signingConfigs 를 추가한다.

 signingConfigs {
        release {
        keyAlias keystoreProperties['keyAlias']
        keyPassword keystoreProperties['keyPassword']
        storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
        storePassword keystoreProperties['storePassword']
        }
    }

마지막으로 buildTypes 의 release 부분을 수정한다.

signingConfigs.debug -> signingConfigs.release 로 변경한다.

이제 모든 설정은 끝났고, 앱번들을 만들어 플레이스토어에 등록하면 된다.

구글 플레이스토어에 앱을 등록하려고 appbundle 파일을 만들었지만 등록을 하면 에러가 난다.

개발자 모드로 만들어서 그렇다는데, Release 모드로 만들어서 등록을 하기 위해서

KeyStore 라는 게 필요하다고 한다. 여러 구글링을 해보니 이 블로그가 가장 적절해서 남긴다.

 

 

[Flutter] M1맥북에서 KeyStore파일 생성하기

터미널에서 flutter doctor -v 명령어 입력하셈그러면 막줄 Java binary at : 이하의 경로를 아래 명령어에 입력하면됨거기뜨는경로\\keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -k

velog.io

 

1. 일단 안드로이드는 JDK 가 필요하기 때문에

개발환경에 JDK 가 있는지 확인한다.

JDK 버전 확인

필자는 있기 때문에 저렇게 나오고, 없는 경우

이곳으로 가서 Mac 용 JDK를 다운받는데, 필자는 8버전으로 했다.(개인적으로 가장 안정적인듯)

그다음 터미널에서 Application 을 찾아 jdk 경로로 찾아가야 하는데, user 밑에 jdk가 설치되는 경우도 있고

최상위 경로에 설치되는 경우도 있는데 필자의 경우 최상위 경로에 있어 그 기준으로 하겠다.

 

cd /
ls -al

최상위 경로에 Applications 폴더

Android Studio.app

보면 글자 사이사이 여백이 있기 때문에 명령어에 싱글쿼터('')를 추가해준다.

설명을 위해 한단계 한단계 썼지만 나머지는 쉬우니 한번에 접근하자.

bin 폴더까지 접근하자

이제 Key Tool 을 만들자.

keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload -storetype JKS

 

이렇게 하면 Key를 만들수 있게 되는데, 중간중간 비밀번호/조직명/이름/국가코드 등 입력하게 되는데

차후 다음 단계에서 진행할 때 비밀번호가 필요하니 꼭 외워두자.

자 이제 사용자 계정 root1 기준 하위 디렉토리를 확인해보자.

이렇게 keystore 파일이 생성되었다.

다음 포스팅에서는 KeyStore 파일을 설정해보겠다.

기존에는 구글 안드로이드의 경우에는 앱 출시의 경우

.apk 파일 확장자로 작성했지만, 2021년 구글의 정책 업데이트로

신규 앱의 경우 .aab 확장자로 출시하도록 변경됐다.

기존 앱은 .apk 확장자로 가능하지만 나 같은 경우 신규 앱이기에

bundle 파일 제작 명령어를 남긴다.

flutter build appbundle

 

간단하다. 용량도 엄청 작아졌다.

플러터에서 웹뷰를 쓰다보니 apk를 만들 때

버전을 맞추라고 에러 메시지가 나왔다.

수정한 결과를 작성한다.

경로 : 플러터프로젝트/android/app/src/build.gradle

defaultConfig {
     minSdkVersion 21
     targetSdkVersion 30
     versionCode flutterVersionCode.toInteger()
     versionName flutterVersionName
}



build.gradle 파일의 defaultConfig object를 저런식으로 수정해야 한다.

 

앱 등록을 하기 위해서 안드로이드 스튜디오에서 apk 파일을 따로

만드는 방법이 있지만 난 커맨드명령으로 작성하는게 편해서 명령어를 적어둔다.

필자의 PC는 'M1' 맥북 프로이기 때문에

arm 기반의 칩셋이 필요하므로 명령에 arm64를 추가한다.

my_app % flutter build apk --release --target-platform=android-arm64

저런식으로 명령어를 쳤더니 apk 파일은 만들어졌지만 뭔가 에러가 엄청나게 많이 발생했다.

뭔가 찜찜하다. 그래서 찾아보니 'Null Safety' 라는 옵션을 추가해야 한다.

my_app % flutter build apk --release --no-sound-null-safety --target-platform=android-arm64

깔끔하게 만들어졌다. ㅎ

추후 포스팅은 실제 플레이스토어에 등록해볼 것이다.

안드로이드 앱번들을 등록 후 출시를 하고 다운로드 받았는데 몇 가지 에러가 발생했다.

여러 포스팅에 적긴 번거로우니 한번에 정리해 놓는다.

  1. ERR CLEARTEXT NOT PERMITTED

구글링을 해보니 도메인이 HTTPS가 아닌 HTTP의 경우에 발생하는 에러라 옵션을 추가하면 된다.

AndroidManifest.xml 파일

Android Manifest.xml 파일로 들어가서,

어플리케이션쪽에

android:usesCleartextTraffic='true'

 

코드를 추가하면 된다.

2. ERR_CACHE_MISS

해당 디바이스가 웹뷰에 접근하기 위해 네트워크 권한을 허용해주어야 한다.

AndroidManifest.xml 파일

Android Manifext.xml 파일로 들어가서,

uses-permission 코드 추가

어플리케이션 밑에

<uses-permission android:name="android.permission.INTERNET" />

 

코드를 추가하면 된다.

Flutter 프로젝트 진행중 안드로이드 가상에뮬레이터 실행중 저런 에러가 나왔다.

알아보니 에뮬레이터의 용량이 부족한 문제인 거 같다.

1. 안드로이드 스튜디오에서 AVD Manager 를 선택한다.

AVD Manager 목록

요 연필모양 아이콘을 클릭한다.

2. Show Advanced Settings 버튼 클릭

AVD 설정화면

3. Internal Storage 용량 변경

메모리 옵션 변경

아래쪽으로 스크롤을 많이 내리면

메모리와 스토리지 설정하는 곳이 있다.

나의 경우 기본값이 800MB 였는데 프로젝트에 라이브러리 몇개 추가하니 해당 에러가 발생한 거였다.

조금 더 확장하여 1200MB 로 바꿔주고 Finish 버튼을 눌러준다.

4. AndroidManifest.xml 파일 변경

해당 파일의 mainfest 안에 저부분을 넣는다.

정상적으로 실행이 된다.

 

+ Recent posts