작업 상태

- 새로운 페이지 작업중이었습니다.

- controller 메소드 생성 후 페이지를 호출하던중 발생했습니다.

- 작업을 했던곳이어서 페이지가 존재할것이라고 생각하고 결과 페이지 확인을 안했습니다.

    @GetMapping("/admin/workings/todos/undone")
    public String unDoneList(Model model) {
        List<Todo> todos = todoService.findByIsCompleted("N");
        model.addAttribute("todos", todos);
        return "todo/list";
    }

에러 메시지 .[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.thymeleaf.exceptions.TemplateInputException: Error resolving template [todo/list], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause
org.thymeleaf.exceptions.TemplateInputException: Error resolving template [todo/list], template might not exist or might not be accessible by any of the configured Template Resolvers

 

원인

일반적으로 다음과 같은 경우에 발생할 수 있습니다.
- 요청한 템플릿이 프로젝트에서 실제로 존재하지 않는 경우. <-- 실제로 존재 하지 않았습니다.
- 요청한 템플릿의 경로가 잘못 지정된 경우.
- Thymeleaf 구성이 올바르게 구성되지 않은 경우.


처리

    @GetMapping("/admin/workings/todos/undone")
    public String unDoneList(Model model) {
        List<Todo> todos = todoService.findByIsCompleted("N");
        model.addAttribute("todos", todos);
        return "working/todolist"; //템플릿페이지 경로변경
    }

템플릿 생성 : src/main/resources/templates/working/todolist.html

 

참고

Thymeleaf 템플릿 엔진에서 시작 기본 위치는 src/main/resources/templates/ 입니다.
 
예를 들어, 
index.html 파일이 src/main/resources/templates/ 디렉토리에 있다면, 
Thymeleaf는 index.html 파일을 찾을 수 있습니다. 
따라서, 스프링 부트 프로젝트에서 Thymeleaf를 사용할 때, 
src/main/resources/templates/ 디렉토리에 HTML 파일을 저장하면, 
이 파일들은 자동으로 Thymeleaf가 처리할 수 있는 템플릿 파일이 됩니다.

스프링 부트에서는 spring.thymeleaf.prefix 속성을 사용하여 시작 기본 위치를 변경할 수 있습니다. 
이 속성을 사용하여 다른 디렉토리에서 템플릿 파일을 찾을 수 있습니다.

templates 디렉토리가 아닌 views 디렉토리에서 템플릿 파일을 찾으려면 
application.properties 파일에서 spring.thymeleaf.prefix 속성을 설정할 수 있습니다.

spring.thymeleaf.prefix = classpath:/views/

Thymeleaf는 src/main/resources/views/ 디렉토리에서 템플릿 파일을 찾게 됩니다.

작업 상태

thymeleaf로 작업을 진행하던 중 다른 곳에서 가져온 코드를 사용하던 페이지에 복사 붙여넣기 하고 발생했습니다..

 

붙여넣은 일부분입니다.

<select th:name="'toblog-'+${category.id}" class="border border-gray-300 p-2 rounded-lg">  

 

에러 메시지 

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates//admin/working/edit.html]")] with root cause
org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'id' cannot be found on null


원인

-  admin/working/edit.html] 여기까지 관련 template 파일은 찾았다는 이야기 이고 여기서 변환중 에러가 발생했다는 메시지 입니다.

- SpelEvaluationException: ${category.id}" <-- 여기의 category가 이미 null 이라 id를 찾을수 없다는 말입니다.

 

처리

- 새로 붙인 관련 객체의 변수로 바꾸고 해결됐습니다.

<select th:name="'toblog-'+${working.id}" class="border border-gray-300 p-2 rounded-lg">  


참고

Property or field 'id' cannot be found on null

null에서 'id' 속성이나 필드를 찾을 수 없습니다.

작업 상태

- 소개 페이지에 나온것처럼 npx create-expo-app AwesomeProject, npx expo start 을 이용해서 작업을 진행하고, 

npx expo run:android를 실행하던중 문제가 발생했습니다.

 
에러 메시지 
requireNativeComponent: "RNSScreen" was not found in the UIManager.


원인
정확한 원인 발견하지 못했습니다. 단지 expo로 만든 프로젝트 초기에는 android native 코드가 없다가 npx expo run:android를 실행하면 android native코드가 생성되는데 이게 현재 사용중인 버전과 다른듯합니다.

 

cd AwesomeProject
npx expo start 또는
expo start 

기초적인 hello 만들때까지도 괜찮았습니다.
npx expo run:android 잘 실행됐습니다.

 

그런데
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { NavigationContainer } from '@react-navigation/native'; 
이것을 쓰기 시작하면서 이것을 실행하면 RNSScreen에러가 나오기 시작했습니다.
requireNativeComponent: "RNSScreen" was not found in the UIManager.

 

처리

>> 기본적으로 
npx expo install react-native-screens react-native-safe-area-context 
이거랑 gesture 설치하면 동작한다고 하는 곳들이 있었지만 저는 다 실패했습니다.

 

결국 expo 에서는 해결 못하고 우회했습니다.
] npx create-react-native-app CPlayer
] expo install react-native-screens react-native-safe-area-context ...
혹시 몰라서 관련 패키지를은 전부 expo install로 설치했습니다.
] npx expo run:android

우회한 경우에는 특이사항 없이 잘 동작했습니다.

참고

https://docs.expo.dev/

 

Expo Documentation

 

docs.expo.dev

문제 발생시 package.json

{
  "name": "cxcer",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "start": "expo start --dev-client",
    "android": "expo run:android",
    "ios": "expo run:ios",
    "web": "expo start --web"
  },
  "dependencies": {
    "@expo/vector-icons": "^13.0.0",
    "@react-native-async-storage/async-storage": "1.17.11",
    "@react-native-community/datetimepicker": "6.7.3",
    "@react-native-picker/picker": "2.4.8",
    "@react-navigation/bottom-tabs": "^6.5.7",
    "@react-navigation/native": "^6.1.6",
    "expo": "~48.0.10",
    "expo-background-fetch": "~11.1.1",
    "expo-constants": "~14.2.1",
    "expo-notifications": "~0.18.1",
    "expo-splash-screen": "~0.18.1",
    "expo-status-bar": "~1.4.4",
    "expo-task-manager": "~11.1.1",
    "loadsh": "^0.0.4",
    "react": "18.2.0",
    "react-native": "0.71.6",
    "react-native-safe-area-context": "4.5.0",
    "react-native-screens": "~3.20.0"
  },
  "devDependencies": {
    "@babel/core": "^7.20.0"
  },
  "private": true
}

작업 상태

- 안드로이드 개발 폰에 임시 apk를 만들어서 설치하려고 하는데 발생한 에러 입니다.

  
에러 메시지 
adb로 설치시 
adb: failed to install .\app-debug.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.a3040 signatures do not match previously installed version; ignoring!]

 

bundletool 로 설치시
E/SplitApkInstallerBase: Failed to commit install session 1461821388 with command cmd package install-commit 1461821388. Error: INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.a3040 signatures do not match previously installed version; ignoring!
[BT:1.14.0] Error: Installation of the app failed.


원인

- 이 오류는 패키지의 서명(Signature)이 이전에 설치된 버전과 다른 경우에 발생합니다. 즉, 같은 패키지 이름(com.a3040)이지만 다른 개발자가 만든 앱인 경우나, 이전에 설치한 앱을 개발자가 임의로 서명을 변경해서 배포하는 경우 등이 해당합니다.

해결 방법으로는 이전에 설치된 버전을 삭제한 후, 새로운 버전을 설치하면 됩니다.

처리

- 스마트폰에서 기존에 설치한 개발 관련 앱을 삭제합니다.

- java -jar .\bundletool-all-1.14.0.jar install-apks --apks=app2.apks  apks 를 이용해서

-adb install app2.apk adb를 이용해서

참고

adb는 Android Debug Bridge의 약자로, 안드로이드 디바이스와 컴퓨터를 연결하여 디바이스에 명령어를 전송하고 데이터를 주고 받을 수 있는 도구입니다.

- 간단한 명령어는 몇가지는 다음과 같습니다:

  • adb devices: 현재 연결된 디바이스 목록을 보여줍니다.
  • adb install <apk file>: APK 파일을 디바이스에 설치합니다.
  • adb uninstall <package name>: 해당 패키지를 디바이스에서 제거합니다.
  • adb shell: 디바이스 쉘에 접속합니다.
  • adb push <local> <remote>: 로컬 파일을 디바이스에 복사합니다.
  • adb pull <remote> <local>: 디바이스 파일을 로컬로 복사합니다.
  • adb logcat: 로그를 보여줍니다.

bundletool은 Android 앱 번들을 생성하고, APK 파일을 만들고, 그리고 APK를 최적화하는 도구입니다.

- 간단한 bundletool 명령어입니다:

  • build-bundle: App Bundle 파일을 생성합니다.
  • build-apks: APK set 파일을 생성합니다. --connected-device 옵션을 추가하면 현재 연결된 기기에 바로 설치할 수 있습니다.
  • install-apks: 생성된 APK set 파일을 설치합니다.

- bundletool build-apks --bundle=app.aab --output=app.apks --mode=universal
- bundletool install-apks --apks=app.apks

 

 

+ Recent posts