분류

2021년 5월 24일 월요일

spring boot기반 batch 프로젝트 생성부터 mybatis 연동 단순하게.

 개요 

회사에서 배치 프로세스를 분리해야 하는 일이 생겼습니다. 인터넷으로 이런 저런 조사를 해보는데 정상적인 문서를 찾기 힘든 것이 현실이고, 구했다 하더라도 입맛에 맞는 구조가 아닌 경우가 많아 최소한의 soruce를 통해 mybatis 연동(MariaDB)까지 정리 해보려 합니다. 

본문의 순서는 다음과 같이 진행 하겠습니다.

1. Eclipse spring Boot 설치 

2. Project 생성 

3. Project 환경 설정 

4. application.properties 설정 

5. Source 코드 생성 

6. 발생할 수 있는 오류

순으로 정리되어있습니다. 캡처를 할 경우 너무 여러 장을 찍어야 하기에 설치 순서는 동영상으로 대체하였습니다. 

그럼 시작하겠습니다. 


1. Eclipse spring Boot 설치 

일단 spring boot 프로젝트를 생성하기 위해서는 Eclipse의 Spring Tool이 필요합니다. Eclipse의 Help 버튼을 눌러 Market Place에 들어가서  Spring Tool을 검색해서 Install 하고 Eclipse를 다시 시작 합니다. 

Spring Tool 인스톨 영상 

2. Project 생성 

Project의 생성은 create a new project -> spring 검색 -> Spring Starter Project -> java 버전 선택 -> project 및 package 명 변경 -> spring batch 선택 -> Mybatis Framework 선택 -> finish 순으로 진행하였습니다. 

project 생성 영상 


3. Project 환경 설정


환경설정에 연관된 파일
환경설정에 연관된 파일은 2가지입니다. 
1) pom.xml을 통한 라이브러리 환경 설정과 
2) 프로젝트 환경 설정의 application.properties 파일입니다. 

1) 라이브러리 환경설정 

우선 저는 mariadb를 연결해야 하기에 mariadb의 maven 라이브러리를 pom.xml에 추가하겠습니다. maven을 통한 라이브러리 추가는 google 에서 maven +라이브러리 를 검색하거나 
메이븐 사이트 https://mvnrepository.com/

위 링크로 접속하셔서 해당 라이브러리를 검색하시면 쉽게 dependency 정보를 찾을 수 있습니다. 

mysql 드라이버 정보


검색된 메이븐 라이브러리중 자신에게 해당하는 버전을 클릭하면 이렇게 하단에 디팬던시 정보가 표기되어 해당 정보를 pom.xml에 붙여넣기 하면 됩니다.

pom.xml에 붙여넣기



4. application.properties 설정 

application.properties에 프로젝트에 사용할 환경 설정을 추가해줍니다. application.properties 는 spring toole에서 자동 완성을 지원합니다. 구동 화면은 아래와 같습니다. 
application.property 설정 영상

실제 application.properties에 수록된 내용은 다음과 같습니다. 
#데이터 베이스 연결에 사용할 드라이버 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#데이터베이스 url 
spring.datasource.url=jdbc:mysql://192.168.0.1:6330/test?serverTimezone=UTC&characterEncoding=UTF-8
#계정 
spring.datasource.username=testUser
#비밀번호
spring.datasource.password=testUser

#mapper 파일이 적재될 위치 sql mapper 파일과 동일하게 맞춰준다.
mybatis.mapper-locations=com/springBatchTest/mapper/*.xml
#커스텀 환경변수 
custom.test=test-value


5. Source 코드 생성 

우선 application.properties에 설정한 위치에 mapper xml파일을 만들어줍니다. 
환경설정 순서(클릭시 커짐)
현재 프로젝트의 application 설정이 마이바티스 까지 연동되는 구조는 다음 순서에 따라 이루어집니다. 
application에서 모델을 연결해주는 것은 mapper location.
모델과 컨트롤러의 연결은 xml 파일내의 namespace가 classPath로 역할을 하게 되더군요. 

수정 및 생성한 소스프로그램은 총 4개의 파일입니다. 
1) testMapper.xml 
2) TestDataMapper.java
3) TestDataService.java
4) SpringBatchTestApplication.java
차례대로 기술하겠습니다. 

1) testMapper.xml 

mysql DB에서 데이터를 조회할 sql 문을 입력합니다. 또한 namespace에 java에서 연동할 인터페이스의 패키지 경로와 파일명을 입력합니다. 
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 인터페이스의 패키지 경로와 클래스명 -->
<mapper namespace="com.springBatchTest.mapper.TestDataMapper">

<!-- 수행할 sql -->
    <select id="getTestDataList" resultType="java.util.Map">
<![CDATA[
SELECT 1 AS COL1 
UNION ALL 
SELECT 2 AS COL1
]]>
    </select>
</mapper>
sql은 간단하게 테스트를 수행할 수 있게 정의하였습니다. 

2) TestDataMapper.java

mapper.xml 에 정의된 위치에 정의된 명칭으로 생성해줍니다. 인터페이스 내부에는 xml에 정의된 sql과 동일한 명칭 그리고 동일한 데이터 형식을 갖고 있는 함수가 있어야 합니다. 
package com.springBatchTest.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface TestDataMapper {
List<Map<String, Object>> getTestDataList();
}
mybatis framework과 java Application간의 인터페이스 역할만 해주므로 정말 내용이 없습니다. SQL이 늘어나는 만큼 증가합니다. 

3) TestDataService.java

서비스에는 인터페이스에 정의된 형식과 동일한 서비스를 구성해줍니다. 이 파일 역시 자동 연결을 위한 선언 ,  서비스 선언 이외에 특별한 내용이 없습니다. 
package com.springBatchTest.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;

import com.springBatchTest.mapper.TestDataMapper;

@Service
public class TestDataService {
    @Autowired
    TestDataMapper testData ; 

    public List<Map<String, Object>> getTestDataList() {
        return testData.getTestDataList(); 
    }
}


4) SpringBatchTestApplication.java

package  com.springBatchTest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.List;
import  java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import  com.springBatchTest.service.TestDataService;

@SpringBootApplication
public class SpringBatchTestApplication {
public static void main(String[] args) {
try (ConfigurableApplicationContext ctx = SpringApplication.run(SpringBatchTestApplication.class , args)) {
SpringBatchTestApplication m = ctx.getBean(SpringBatchTestApplication.class );
m.selectDataf(); 
}catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
}
  @Autowired
  TestDataService  testDataService;
    public void selectDataf() {
    List<Map<String, Object>> tmp = testDataService.getTestDataList();
    System.out.println(tmp.size());
    }
}


자 이제 테스트용 코드 생성은 끝났습니다. 

6. 발생할 수 있는 오류

1) 정상 처리 시 디버깅 콘솔 내용 


2021-05-24 19:28:03.528  INFO 10964 --- [           main] c.s.SpringBatchTestApplication           : Starting SpringBatchTestApplication using Java 15.0.1 on DESKTOP-3QN7REN with PID 10964 (D:\blogger\springBatchTest\target\classes started by jinyboys in D:\blogger\springBatchTest)
2021-05-24 19:28:03.533  INFO 10964 --- [           main] c.s.SpringBatchTestApplication           : No active profile set, falling back to default profiles: default
2021-05-24 19:28:06.259  INFO 10964 --- [           main] c.s.SpringBatchTestApplication           : Started SpringBatchTestApplication in 3.553 seconds (JVM running for 4.553)
2021-05-24 19:28:06.277  INFO 10964 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...

2021-05-24 19:28:06.771  INFO 10964 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2
2021-05-24 19:28:06.897  INFO 10964 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
945  INFO 10964 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

수행할 로직이 없기 때문에 약 3,4초만에 수행되고 종료되며 임시로 생성된 sql에서 받는 데이터 2건에 대한 사이즈 정보가 표기됩니다. 

2) application.properties내의 mapper 경로가 잘못 된 경우  

빨간색 글자처럼 파일을 찾을 수 없다는 메시지가 나옵니다. 
2021-05-24 19:31:39.543  INFO 7172 --- [           main] c.s.SpringBatchTestApplication           : Starting SpringBatchTestApplication using Java 15.0.1 on DESKTOP-3QN7REN with PID 7172 (D:\blogger\springBatchTest\target\classes started by jinyboys in D:\blogger\springBatchTest)
2021-05-24 19:31:39.553  INFO 7172 --- [           main] c.s.SpringBatchTestApplication           : No active profile set, falling back to default profiles: default
2021-05-24 19:31:42.462  INFO 7172 --- [           main] c.s.SpringBatchTestApplication           : Started SpringBatchTestApplication in 3.802 seconds (JVM running for 5.327)
2021-05-24 19:31:42.479  INFO 7172 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...

2021-05-24 19:31:42.987  INFO 7172 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2021-05-24 19:31:43.074  INFO 7172 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2021-05-24 19:31:43.086  INFO 7172 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
Invalid bound statement (not found): com.springBatchTest.mapper.TestDataMapper.getTestDataList

3) mapper.xml 파일 내부 SQL구문의 ID와 mapper.java 인터페이스가 불일치 할 경우

위와 동일한 오류가 발생합니다. 
 Invalid bound statement (not found): com.springBatchTest.mapper.TestDataMapper.getTestDataList

4) service.java 클래스 내에 @Autowired 설정이 없는 경우

Cannot invoke "com.springBatchTest.mapper.TestDataMapper.getTestDataList()" because "this.testData" is null

5) mapper.java 클래스가 없거나 비정상 , @mapper 설정이  없는 경우

Description:

Field testData in com.springBatchTest.service.TestDataService required a bean of type 'com.springBatchTest.mapper.TestDataMapper' that could not be found.

The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.springBatchTest.mapper.TestDataMapper' in your configuration.

Error creating bean with name 'springBatchTestApplication': Unsatisfied dependency expressed through field 'testService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'testDataService': Unsatisfied dependency expressed through field 'testData'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.springBatchTest.mapper.TestDataMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}


이상 스프링 배치 프로젝트 생성부터 mybatis 연동까지 그리고  발생할 수 있는 오류까지 알아봤습니다. 

이렇게 쉽게 4개의 파일만 설정하면 연동할 수 있는 기본적인 형태를 이해하지 못하고 엉뚱하게 정리 해 놓은 글들이 너무 많아 직접 정리를 해 보았습니다. 누군가에게 도움이 되면 좋겠네요 ㅎㅎ. 

2021년 5월 23일 일요일

자전거 코스 대전 -> 청주 무심천

개요 

지난번에 약 80km의 거리 주행 이후 이번주에는 100km를 넘겨보겠다는 생각에 대전에서 청주의 무심천을 잇는 약 110km 주행 코스를 만들어보았습니다. 참고로 청주의 무심천은 봄철에 벚꽃이 이쁘게 피어 사람들이 많이 다니는 곳 입니다. 

코스 난이도 기난이도 기준은 3가지이며 다음과 같습니다. 

1. 거리 20km 마다 1점 

2. 업힐 200m 마다 1점 

3. 보급 20km 마다 확보되지 않을 경우 보급 주의를 표시하도록 하겠습니다. 보급은 편의점을 기준입니다. 보급 상태가 주의 일 경우 50km 당 음료수 1리터, 에너지바 1개는 있어야 달릴 만 합니다. 

점수가 높을수록 난이도가 어렵다고 생각 하시면 됩니다. 평균은 거리와 업힐의 평균입니다. 

평균 점수 기준  1~3점 초급, 4~6점 중급 7~9점 고급  10점 이상 특급 되겠습니다.

현 코스의 난이도는 다음과 같습니다. 

1. 거리 :  6

2. 업힐 :  3

3. 보급 : 주의 

평균 : 4.5점 중급


1. 코스파일 

대전 -> 청주 무심천.tcx

대전 -> 청주 무심천.gpx

코스 파일은 두 가지 중 본인에게 맞는 파일을 선택해서 다운로드 받으시면 됩니다.


2. 코스 개요 

대전에서 강변을 따라 청주를 일주하는  코스이며 중간에 약 5km 가량의 국도가 포함되어있습니다. 보급포인트는 약 40km 언저리에서 편의점과 짬뽕집(개인적인 욕심), 식당가 등을 표기하여 놓았습니다. 

코스의 특징은 경유 4에 해당하는 대청댐을 통과 할 때 약 12%의 경사가 있고 해당 지역에 고도가 몰려 있습니다. 따라서 후반 체력이 딸린다면 우측으로 1회전 후반 체력에 문제가 없다면 좌측으로 1회전을 도시면 되겠습니다. 

대전 - 청주 무심천 1회전 코스

해당 구간 레포트
획득고도는 643m 로 대전 -> 세종 호수공원 코스에 비해 약 250m 밖에 높지 않으나 무심천 -> 대청댐 구간이 약한 오르막이 지속되는 형태입니다. 
초반에 강오르막 하나 지나고 쭉 편하게 가느냐. 후반을 힘들게 달리느냐는 개인 취향에 맡기겠습니다. 


3. 코스 주행 후기 

해당 코스 주행기록 
시작 위치를 약간 조정하는 바람에 gpx 리포트보다 20km 짧게 다녀왔습니다. 매도 먼저 맞는 편이 좋을 것 같아 대청댐 방향으로 출발했습니다. 원래 코스보다 짧아졌지만 업힐의 변화는 없기에 실제 오르막은 427이 맞을 것 같습니다. 

100km 가까운 주행인데 저녁 약속이 있어 중간 보급지점을 모두 건너뛰었더니 후반부에 칼로리 부족으로 힘이 딸립니다. 에너지바 2개정도는 보급품으로 챙겨가는 것이 어떤가 합니다. 실수로 포도당 캔디도 안 챙기는 바람에 더욱 힘들었습니다. 

또한 여름에 가까운 기온 때문에 땀을 많이 흘려 물도 1리터로는 부족했습니다. 

주의사항 
1. 지도상으로 12시 방향 정도 되는 부근에 공사현장이 있습니다. 청주와 세종의 중간 점. 길이 좁아지고 코너가 안보이니 속도를 줄이세요. 오늘 길막 당해서 사고났습니다. 블랙박스 안달고 갔는데 길막 한 분이 넘어지는 걸 보시고 튀더라구요. 보험 가입해야겠습니다. ; 

2. 2회 주행 결과 해당 길에 노인분들이 MTB로 많이 다니시는데 오르막에서 와리가리를 심하게 합니다. 내리막 추돌 주의하셔야 합니다. 

2. 청주방면은 화장실과 휴식공간이 별로 없고, 청주와 세종 사이에 보급을 할 수 있는 포인트가 약 1시간 가량 찾을 수 없습니다.  무엇보다 물 확보를 꼭 하셔야 합니다. 그리고 2회 다녀온결과 청주엔 화장실이 없습니다. (있긴 한데 없다고 할만큼 적습니다. ) 

대청댐 현암정 전경

대청댐 현암정 전경

청주 무심천



2021년 5월 9일 일요일

자전거 코스 대전 -> 세종호수공원

 개요 

어김없이 봄은 왔고, 자전거 타기 좋은 날씨가 계속 되고 있습니다. 오랜만의 외출이기도 해서 큰 무리 없이 다녀올 수 있는 80km 의 코스를 만들어보았습니다. 획득 고도는 약 450m로 거리에 비해 업힐이 적은 편이며, 중간에 보급 포인트로 편의점과 식당의 위치를 찍어 놓았습니다. 

코스 난이도 기준을 잡아보았습니다. 난이도 기준은 3가지이며 다음과 같습니다. 

1. 거리 20km 마다 1점 

2. 업힐 200m 마다 1점 

3. 보급 20km 마다 확보되지 않을 경우 보급 주의를 표시하도록 하겠습니다. 보급은 편의점을 기준입니다. 보급 상태가 주의 일 경우 50km 당 음료수 1리터, 에너지바 1개는 있어야 달릴 만 합니다. 

점수가 높을수록 난이도가 어렵다고 생각 하시면 됩니다. 평균은 거리와 업힐의 평균입니다. 

평균 점수 기준  1~3점 초급, 4~6점 중급 7~9점 고급  10점 이상 특급 되겠습니다.

현 코스의 난이도는 다음과 같습니다. 

1. 거리 :  4

2. 업힐 :  2

3. 보급 : 주의 

평균 : 3점 초급


1. 코스파일

대전 -> 세종호수공원 tcx

대전 -> 세종 호수공원 gpx

코스 파일은 두 가지 중 본인에게 맞는 파일을 선택해서 다운로드 받으시면 됩니다. 

2. 코스 개요 

엑스포에서 대청댐을 가는 방면에 있는 원촌교에서 시작합니다. 원촌교는 벚꽃이 약 2km 가량 이어지는 벚꽃 시즌에 꼭 가볼만한 장소기도 하구요 주변에 주차할 수 있는 공간이 제법 있는 편입니다. 그래서 종종 활용합니다. 

1) 원촌교 

2) 보급 

3) 세종 호수 공원 서측 출입구

4) 세종 호수 공원 북측 출입구 

5) 보급 

6) 원촌교

의 코스입니다.

길은 100% 자전거길로 갈수도 있고, 천변은 자전거길과 국도가 같이 있어 선택해서 달릴 수 있습니다. 코스 자체는 자전거 전용도로로 구성되어있습니다. 

코스 레포트
대부분 평지로 이루어져 있고 대부분 4% 경사각이 낮은 업힐입니다. 또한 업힐이 길게 이어지지 않기 때문에 별로 힘들지 않고 다녀올 수 있습니다. 


3. 주행 후기 

평소 자주 다니던 길 이기에 별 무리 없이 다녀왔지만, 그간 체력 훈련을 게을리 한 상태여서 다녀오고 나니 조금 아프긴 합니다. 자전거 도로 좌우로 쉴 곳이 자주 있어 체력이 약한 분들도 어렵지 않게 왕복 할 수 있을 거라 보입니다. 

왕복 85km 업힐은 378m 왕복 이후 엑스포 남문 광장을 조금 돌아 100km를 채웠습니다. gps는 가끔 보며 자전거 길만 따라가면 끝이라 딱히 안내할게 없습니다. 길 찾기 난이도 슈퍼 이지 입니다. 


1) 보급 진입로 
세종시에 거의 도착할 때 쯤 합강공원 언저리에 2개의 보급 포인트가 있습니다. 하나는 GS 편의점이고 다른 하나는 식당과 까페가 모여있는 곳입니다. 참고로 까페에서는 음료 외에 볶음밥 같은 몇 가지 요리를 판매합니다. 다만 일 하시는 분이 주문을 잘 못 알아듣습니다.
그래도 밥 달라면 밥 주고 빵 달라면 빵 주니 대충 먹으면 됩니다. 빵 달라는 데 국 주는 정도는 아닙니다.

편의점은 자전거 도로와는 50m 가량 떨어져있어 지도를 보고 찾아가셔야 합니다. 

식당은 아래 나온 동영상 대로 진입로 입간판이 세워져있어 보고 들어가시면 됩니다. 다만 너무 늦은시간에는 영업하지 않는 것 같습니다. 따라서 야간 라이딩시에는 편의점을 이용하시면 되겠습니다. 

대전 -> 세종 호수공원 풀코스 파일입니다. 2배속 할걸 그랬네요 ㅎㅎ;;;



이상 안전하고 즐거운 자전거 여행 되시길 기원합니다. 

2021년 4월 2일 금요일

java runtime exec() 에서 curl post 사용 오류 및 해결

 개요 

오픈 소스 기반 프로그램 수행을 위해 curl 커맨드를 외부 데이터베이스와 연결하여 결과를 받는데 windows 환경에서는 잘 되었지만 linux 기반에 동일한 tomcat과 java 환경에서 수행 시 오류가 발생하였습니다. 오류 메시지는 종류도 다양하지만 주로 아래와 같은 메시지가 나왔습니다. 

보내는 메시지는 다음과 같았습니다. 

String queryTable = "curl -X POST -H \"Content-Type:application/json\" " + " -d  @" + filePath + " " + serverUrl;

형태의 비교적 단순한 문장이었고, 쿼리를 담은 파일을 포함하여 발송합니다. 

여기서 filePath 는 데이터를 전송하기 위해 생성한 데이터 파일의 절대경로입니다.  serverUrl은 전송 대상 서버의 전체 url 입니다. 

옵션 중 -d 뒤의 @ 옵션을 제거하면 파일이 아닌 문자 데이터 형태로 전송할 수 있습니다. 

에러 메시지는 대략 모두 비슷한 유형으로 <h1>이 H4로 바뀌는 정도의 오류였습니다. 

 illegal character varchar='" 

<h1>bad message 400

windows 기반의 tomcat9에서 수도 없이 많은 테스트를 거친 프로그램이기에 믿고 리눅스에 맡겼더니 배신도 이런 배신이 없습니다. 


문제코드 

여러 검색 결과 문제는 java 자체의 Process 클래스에 의한 처리였습니다. 외부 명령을 실행하기 위해 다음과 같은 코드를 작성하여 사용해왔습니다. 

public static String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
String outString = ""; 
try {
p = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader(new  InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null) {
output.append(line + "\n");
}
p.waitFor();
outString= output.toString();
            if (p.exitValue() != 0) {
                // shell 실행이 비정상 종료되었을 경우
            BufferedReader errorBufferReader = null; 
            StringBuffer errorOutput = new StringBuffer();
                errorBufferReader = new BufferedReader(new InputStreamReader(p.getErrorStream(), "EUC-KR"));
                String msg  = "";
                while ((msg = errorBufferReader.readLine()) != null) {
                    errorOutput .append(msg + System.getProperty("line.separator"));
                }
            }
 
} catch (Exception e) {
logger.error(e.getMessage());
}
return output.toString();
}

상위 스크립트 처럼 java 자체의 process runtime exec를 사용 할 경우 linux나 macos 환경에서 알 수 없는 오류로 고생하게 됩니다. 또한 java 자체의 processbuilder를 활용하더라도 동일한 현상이 나타나는 것을 확인하였습니다. 

여러 문서들을 검토 한 결과 Apache commons common-exec 를 사용할 경우 해당 문제가 해결된다고 합니다. 


https://commons.apache.org/proper/commons-exec/

위 라이브러리를 직접 다운 받아 사용하시면 됩니다. maven 환경이라면 dependency에
아래와 같은 항목을 추가해주세요
pom.xml
<dependency>  
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-exec</artifactId>
    <version>1.3</version>
</dependency>  

해결 코드 

package Controller;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.PumpStreamHandler;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class apCmdLine {

private static final Logger logger = LoggerFactory.getLogger(apCmdLine.class);
 
/**
  * linux 에서 shell script가 비정상 실행되는 오류에 대한 fix 
  * @param command
  * @return
  * @throws Exception
  */

 public String execAndRtnResult(CommandLine command) throws Exception {
      String rtnStr = "";
              DefaultExecutor executor = new DefaultExecutor();
      ByteArrayOutputStream bs = new ByteArrayOutputStream();
      PumpStreamHandler streamHandler = new PumpStreamHandler(bs);
      executor.setStreamHandler(streamHandler);
      int exitCode = executor.execute(new CommandLine(command));
      rtnStr = bs .toString();
      logger.info("exitCode : " + exitCode);
      logger.debug("outputStr : " + rtnStr );
      return rtnStr;
}
}


추가오류 

1. 전송 메시지 출력 

linux 환경에서 정상적으로 데이터 처리가 되고 난 이후 rtnStr로 받은 결과에 위 사진과 같은 메시지가 중간중간에 끼어드는 문제가 발생하였습니다. 
r -   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100    90  100    70  100    20  14629   4179 --:--:-- --:--:-- --:--:-- 17500

이 문제를 해결 하기 위해 JSON 스트링이 아닌 데이터에 대한 필터를 고려해보았으나, 라인단위의 중간에 해당 데이터가 끼어드는 경우도 발생하였습니다. 검토 결과 CURL로 데이터를 전송할 경우 전송 결과에 대한 알림이 발생한다고 합니다. 이것 역시 WINDOWS 환경에선 발생하지 않습니다. 

검색에 시간은 제법 들었고 필터도 해보고 여러 삽질을 해봤지만 실제 고치는 방법은 매우 단순했습니다. URL 앞에 -s만 붙여주면 되는 일이었습니다.  

보내는 메시지에 대상 서버 주소 앞에 -s 옵션을 붙여줍니다. -s 는 silent 시스템 메시지를 보내지 마라는 명령어입니다. 
String queryTable = "curl -X POST -H \"Content-Type:application/json\" " + " -d  @" + filePath + " -s " + queryServer; 

비슷한 유형을 정리해 놓은 글을 링크합니다. (영문입니다.)

2. 메시지 길이가 길어 스트림을 초과 

이런 경우는 흔치 않을 것 같습니다. json 형태의 데이터를 보내고 그 결과를 받다보니 curl에서 전송할 수 있는 범위를 넘어가더군요. 길이가 길 경우 교환 데이터를 파일 형식으로 보내면 해당 문제는 사라집니다. 하지만 이 방법 역시 문제가 있습니다. json 파일 형태로 보내다보니 파일을 작성한 시점에 동시 트랜잭션이 여러 건 일어나고 서로 다른 데이터를 요구했을 경우 해당 트랜잭션에서 내가 원하는 데이터가 정말 갔다는 것을 보장할 수 없죠. 결국은 runtime exec를 통해 데이터를 교환하는 것 보단 httpconnection을 통해 데이터를 교환하는 것이 적절한 처리 방법으로 생각됩니다. 


이상입니다. 
읽어주셔서 감사합니다. 
읽으신 분에게 도움이 되면 좋겠네요. 

2021년 3월 16일 화요일

로봇 청소기 샤오미 드리미 F9 개봉, 로봇청소기 4세대 비교

 개요

샤오미 로봇 청소기를 산지도 벌써 3년이 다되었습니다. 그간 기술 진보도 제법 있었을 거란 생각도 들고, 옮긴 회사 사무실에 청소하시는 분이 따로 없어 로봇 겸사겸사 로봇 청소기를 신규 구매 하였습니다. 

첫 로봇 청소기는 3년 전 알리익스프레스를 통해 236$ (약 25만원) 에 구매했습니다. 당시 국내 구매는 50만원 선으로 제법 비쌌습니다. 따라서 직구가 가능한 사람이면 다들 직구로 구매 했을 거라 생각됩니다. 

샤오미 로봇 청소기 4세대 구매내역

이번에 산 드리미는 티몬을 통해 이전보다 저렴한 21만4천원에 기능까지 업그레이드 된 AI 학습 기반 제품입니다. 

샤오미 드리미 F9 구매 내역

최근은 직구족이 많다 보니 국내 사이트에서도 해외에서 구매하는 것 보다 더 저렴하게 구매할 수 있는 제품들이 늘어가고 있는 추세입니다. 이런 점은 제법 긍정적입니다. 예전에 B모 사이트의 미밴드 물량 독점 횡포 같은 일이 어디선가는 일어나고 있겠지만, 점점 더 나아지겠지요. 국내 AS를 위해 최저가 보다 3만원 비싸게 구매했습니다. 하지만 알리익스프레스에도 210달러 인 것을 감안하면 국내가 저렴했습니다. 

3월 9일에 주문했고 15일에 도착했으니 구매 소요 기간은 약 일주일입니다. 오래 걸리지 않고 금세 도착하는 걸 보면 직구 정말 할만합니다. 

첫 번째와 동일하게 샤오미를 선택하게 된 이유는 청소 능력과 내구도 입니다. 3년 사용 기간 동안 아무 문제 없이 사용했습니다. 하지만 제법 띨 해서 종종 혼자 함정에 빠지곤 했는데 매주 1회 정도 문턱에 걸리곤 했습니다.  F9는 그러지 않기를 빌면서 비교 시작하겠습니다. 


1. 스펙 비교 


스펙만 봐서는 스마트 맵핑과 배터리 용량 , 청소 흡입 압력 이외에 큰 차이는 없어 보입니다. 하지만 까보면 제법 세세한 곳에 차이가 있습니다. 문턱 등반도 두 기종 모두 2cm입니다. 

2. 제품 비교 

 포장 비교 

4세대의 포장과 크게 달라진 점 없이 2중 포장에 종이상자입니다. 

4세대 포장 

외부박스

내부박스

 드리미 F9 포장 

외부박스 
내부박스

포장지에 로봇청소기의 모습과 박스 색감만 바뀐 정도. 별 차이 없습니다. 

구성 비교 

샤오미 4세대 

청소기, 충전기, 전원케이블, 필터, 먼지통 청소 브러시 물통
 걸레받이

샤오미 드리미 F9

청소기, 충전기, 전원케이블, 사이드브러시, 물통
샤오미 4세대에는 필터가 하나 추가로 들어가 있고, 먼지 제거용 브러시가 별도로 있는 데 드리미 F9에서는 먼지통 위치에 내장되어있으며, 4세대 까지는 물걸레에 물을 공급하는 부분이 삼투압 필터였던 반면 F9에서는 급수 펌프로 교체되었기 때문에 걸레받이가 존재하지 않습니다. 

물통 차이점 

샤오미 4세대 


삼투압 필터 

샤오미 드리미 F9

급수 모터 장착
이외에도 물통의 용량이 2배가량 늘었습니다. 다만 급수모터의 경우 연속 사용 시간이 290시간이란 점을 보면.... 수명이 길지 않은 소모품인 것 같습니다. 다만 모터가 생겨 수량 조절이 가능합니다. 물이 부족할 경우 알림을 주지는 않습니다. 삼투압 필터와의 차이는 삼투압 필터는 늘 물이 새어 나오기에 물 충전 후 몇 일 지나면 않으면 걸레에서 썩은 내가 납니다. 하지만 급수 모터는 필요한 양 만큼만 분사 하기에 이 부분이 개선 되었습니다. 

사이드 브러시 스테이
4세대에선 먼지통 청소용 브러시를 잃어버리지 않게 잘 보관해야 했던 반면 드리미는 내장되는 위치가 있어 잃어버릴 염려가 없습니다. 

충전 도크 차이점 


왼쪽이 드리미, 오른쪽이 4세대
충전 도크는 모양이 살짝 바뀌었고, 걸레받이가 없는 점이 다릅니다. 

사이드 브러시 차이점 

나사 고정 샤오미 4세대 

나사 없이 끼우는 형태의 드리미 F9
외형의 다른 점만 비교하자면 아주 약간 편리해졌고 아주 약간 좋아진 것 같습니다. 

3. 청소 능력 차이 

가장 큰 차이는 기존 시각 내비게이션 1.0이 2.0으로 업그레이드되었다는 부분인데요 기존에는 한번 청소한 맵을 기억하지 못해서 청소기가 매번 부딪히고 깨졌던 반면 이제 학습을 통해 경로를 자동 지원한다고 합니다. 

두 장비의 청소와 장애물 넘는 모습에 대한 영상을 기록해보았습니다.  저희 집에서 찍을 수 있는 영상의 특징이 있다면. 바로 문턱을 제거하지 않고 문턱에 경사판을 설치한 곳과 경사판이 없는 2cm의 낮은 문턱이 있어 청소기의 경사로 등판 성능을 점검할 수 있다는 것이네요. 

샤오미 4세대 



샤오미 드리미 F9

장애물이 모여있는 작은 방 쪽인데요 두 장비 모두 벼랑 감지를 통해 추락하지 않고, 문턱도 경사로를 통해 원활하게 넘습니다. 그런데... 구형이 6분30초 신형이 5분에 작은방 청소를 완료한 영상을 보면 경사로에 걸렸을 때 탈출하는 알고리즘이 개선된 것으로 보이며 신형의 경우 코너 청소 시 회전이 빨라 전체적인 청소 시간이 단축되는 경향이 있는 것 같습니다. 

4세대도 저에게는 우렁각시처럼 안보일 때 청소해주고 늘 바닥을 깨끗하게 유지해주는 고마운 녀석이었습니다. 조금 띨 한게 문제였죠. 가야 할 곳을 가지 못하고, 특정 지역만 청소 시킬 수 없으며, 벽에 대가리를 항상 쿵쿵 찌어대는... 조금 많이 모자란 자학적인 아이였죠. 드리미는 그 부분이 제법 해소된 것 같습니다. 

다음 영상은 AI 학습이 완료된 상태의 모습입니다. (3회 청소를 완료하면 AI학습이 완료됩니다.)

샤오미 드리미 F9 AI학습 이후 

학습이 완료된 이후는 모서리부의 장애물여부를 판단하기 위해 가볍게 부딛히는 것 이외에는 쿵쿵 찍어대는 현상도 없어졌고, 학습한 지역에 대한 청소 계획을 미리 세우고 시작하는 것 처럼 자연스럽게 움직여 청소 시간이 단축되는 편입니다. 

구역 청소를 수행하는 모습


이전에는 없던 소프트웨어 가상 벽과 지역 청소 기능 덕분에 이제 이물질을 닦기 위해 청소기가 40분 동안 앵앵 거리는 소리를 듣지 않아도 되어서 더욱 좋습니다. 

우리 집 우렁각시 더 예뻐졌네요. ㅎㅎㅎ

이상 샤오미 4세대에 대한 구매기를 마칠게요. 
새로운 로봇 청소기를 구매하시는 분에게 도움이 되면 좋겠네요. 
긴 글 읽어주셔서 감사합니다. 

2021년 3월 14일 일요일

차박 자충메트 vs 에어메트

 개요 

2020년 11월부터 캠핑 준비를 했는데. 코로나 때문에 캠핑을 갈 일은 없지만 캠핑 용품은 하나 둘 사서 모으고 있습니다. 나름대로 혼자 차박은 종종 하고 자동차 실내 용 텐트도 구비해서 따듯한 날엔 숲속에서 잠을 자고 오곤 합니다. 

차박을 하더라도 매트는 필요합니다. 제차 니로는 뒷 열을 접어서 평탄화 할 경우 바닥이 제법 단단한 편이기도 하고, 그대로 자면 좀 어깨나 등이 아프고 배깁니다. 그래도 돌처럼 단단한 편은 아니기에 약간의 쿠션감만 있으면 충분히 잘 수 있습니다. 

따라서 자충매트던 에어매트던 부피가 크지 않은 매트는 모두 사용할 수 있습니다. 하지만 어떤 것이 정말 실용적인가에 대한 고민을 하지 않을 수 없습니다. 그래서 비교 해보려 합니다. 

비교하려는 제품은 둘 다 중국 직구를 통해 구매한 이름 모를 회사의 자충식 매트와 네이처 하이크의 에어매트 입니다.  비교를 시작해보겠습니다. 


1. 특징 

에어매트와 자충매트의 차이점은 자충매트는 충전을 위한 내장재(주로 스펀지)가 포함되어있다. 에어매트는 포함되어있지 않다. 

위 특징에서 파생되는 다른 특징으로 자충매트는 필연적으로 부피가 큽니다. 에어매트에 비해서 유사한 사이즈면 약 8배나 됩니다. 에어매트는 껍질만 있으면 되니까요. 그리고 무게가 무거워집니다. 

에어매트 1.1kg

자충매트 2.5kg

세로 자충매트 60cm 에어매트 22cm

가로 : 자충매트 22cm 에어메트 10cm

부피가 커지고 무게가 무거워지면 차박에선 큰 차이가 없지만 제한된 량의 짐만 가져갈 수 있는 백패킹에선 짐을 쌀 때 문제가 생깁니다. 여기서 용도가 완전히 갈라지게 됩니다. 에어매트는 다용도 인 반면 자충매트는 차박 전용으로 사용할 수밖에 없습니다. 

2. 설치 소요 시간 

캠핑이던 차박이던 백패킹이던 시간은 언제나 소중합니다. 그래서 각각의 펴고 접는 시간을 체크해보았습니다. 둘 다 제법 자주 사용하는 편이기에 숙달 되어있습니다. 

일단 자충 매트는 처음에 구매할 때 이런 식으로 약 7cm 두께까지 커진다고 했는데 절대로 절대로 이 정도까지 펼쳐지지 않으며 2일 정도 방치하면 약 5cm두께까지 펼쳐집니다. 보통 3cm정도의 낮은 두께로 사용합니다. 

자충매트의 경우 완전히 펴지는데 약 2분 접는데 약 3분이 걸렸고, 에어매트의 경우 완전히 펴는데 약 5분 접는데 다시 4분이 소요되었습니다. 그리고 완전히 공기가 찼을 때 높이가 7cm 가량 되는데 헤드레스트 부분은 밟아도 쿠션감이 있는 반면 바디 부분은 밟으면 쿠션감이 사라집니다. 앉거나 밟을 경우 바닥의 재질감이 그대로 느껴질 만큼 접촉면이 적으면 아픕니다. 파쇠석에서 사용하기엔 무리가 있을 정도 입니다. 지압이 필요하다면 뭐... 

다만 에어매트의 경우 펼치는데 걸리는 시간은 도구를 사용하여 축소할 수 있습니다. 약 2분이 소요됩니다. 

자충 매트 펼치고 접는 영상.  약 5분

에어매트 펴는 영상 약 5분
에어매트 접는 영상 약 4분

에어펌프를 사용해 에어매트 펴는 영상 약 2분 

에어펌프는 나름 조명 기능도 달려있고 보조 배터리로 활용할 수 있어 활용도가 좋은 것 같습니다. 제가 살 때는 6만원에서 8만원 선이었는데 최근 가격이 3만원 근처까지 내려왔습니다. 공기 충전 식 매트를 사용할 경우가 아니더라도 숯이나 나무에 불을 붙일 때 입으로 불 필요가 없어 매우 편리한 제품입니다. 개인적으론 캠핑, 차박 필수품 같은 정도 입니다. 에어매트 뿐 아니라 자충매트에도 공기를 빠르게 주입 시킬 수 있습니다. 

3. 장단점 

자충매트 

장점 
1. 펴고 접기가 간단하고 시간이 적게 든다. 
2. 매트 위에서 놀 때 제법 편하다. 
3. 매트를 깔고 돌을 밟아도 발이 아프지 않다. 
4. 구멍이 나도 사용에 지장이 없다. 

단점 
1. 부피가 크다. 
2. 무겁다. 

에어매트 

장점 
1. 가볍다
2. 부피가 작다

단점 
1. 공기를 넣는데 시간이 조금 더 소요되는 편이다. 
2. 자려고 전신을 눕히지 않는 이상 쿠션감이 없다. (걷거나 앉을 경우 돌바닥 느낌을 다 느낌)
3. 구멍이 나면 사용할 수 없다. 

자충매트나 에어매트 모두 이 장단점을 해결한 제품이 분명 있을 것 입니다. 중국산이기에 이런 느낌을 느끼는 것 일 수도 있습니다. 에어매트의 경우 높이가 13cm 이상 되면 이런 문제가 없을 것 같습니다만.. 그런 제품은 가격이 비쌉니다. 겨울의 한기도 막아줄 수 있다는 성능 평가들이 있기 때문이죠. 캠핑용품은 혹한기를 견딜 수 있을수록 가격이 비쌉니다. 


이상 자충매트와 차박 매트의 특징을 주관적으로 기술해보았습니다. 
누군가의 선택에 도움이 되었으면 좋겠네요 ㅎㅎ
읽어주셔서 감사합니다. 

2021년 3월 8일 월요일

이동식 욕조 3종 형태별 비교 및 구매 시 참고사항

개요 

이전부터 욕조가 있으면 조금 더 저렴한 가격에 집에서 목욕을 즐길 수 있기에 이동식 욕조를 종종 사용해왔습니다. 2021년 현재 코로나로 인해 목욕탕을 가지 못하게 되기도 했고 해서 그간 사용했던 욕조 3종에 대한 정리를 해보고자 합니다. 

사용했던 욕조는 3가지 형태입니다. 집에 설치된 욕조가 없는 경우 사용할 수 있는 욕조는 튜브형, 접이형, 이동형으로 나뉩니다. 이런 욕조는 대게 플라스틱이나 비닐로 만들어집니다. 이동식 욕조 대부분은 중국에서 생산되어 한국의 유통업체를 거쳐 판매됩니다. 따라서 모든 제품에 공통적으로 국내 독성 테스트 결과가 첨부된 제품을 사는 것이 안전합니다. 


구매시 주의사항 

1) 해외제품의 경우 부피 때문에 배송비가 많이 나가니 국내 구매를 하는 편이 좋습니다. 

2) 대부분 중국 생산이기에 국내 구매시에도 제품의 시험 성적서를 공개하는 사이트에서 구매하는 것이 좋습니다. 


사이즈 선택 

아래 남녀 평균 사이즈를 참조하시면 치수를 재지 않아도 될 것 같습니다. 

kosis자료 2015년 인체조사

2015년 인체 조사에 따르면 평균 신체 사이즈중 욕조와 관련된 부분은 다음과 같습니다. 
남성 평균 어깨 너비 40cm, 허리 높이 105cm, 앉은키 93cm
여성 평균 어깨 너비 35cm, 허리 높이 96cm,   앉은키 93cm 
어깨 너비가 조금은 이상합니다. +5는 최소 해줘야 하지 않을까 합니다. 

위 지표 중 어깨 너비는 +5cm정도 하면 여유 있게 사용하실 수 있고, 
허리 높이는 다리를 쭉 뻗을 경우 허리 높이 정도의 길이가 나올 거라 예상 됩니다. 
무릎을 굽힐 경우 -30cm 정도는 가능합니다. 
앉은 키 역시 목 위 30cm 정도가 되므로 63cm 정도면 어깨가 잠길 수 있는 높이입니다. 

즉 평균적으로 필요한 욕조 사이즈는 
성인 남성이면 가로 45 바닥면 길이 74 높이 63 정도면 사용에 지장이 없고 
성인 여성이면 가로 40 바닥면 길이 66 높이 63 정도면 사용에 지장이 없습니다. 
개인의 차에 따라서 더하거나 빼면 되겠습니다. 


다음은 종류 별로 실제 사용했을 때 느낀 주관적인 장단점을 기술하겠습니다. 직접 사용해본 후기니 주관적일 수 밖에 없습니다. 감안하시기 바랍니다. 


1. 튜브형 

인터넷에서 구매할 수 있는 제품 중 제법 저렴한 제품에 속합니다. PVC 재질로 만들어졌습니다. 이런 형태의 저가 제품은 PVC로 보시면 됩니다. 제가 2018년도에 구매했을 당시에는 가장 저렴했습니다. 물미연이라는 중국 제품이 당시에 N쇼핑에서 가장 쉽게 구매할 수 있었으며 알리를 통해 28$를 주고 구매했습니다. 당시 1$당 환율이 한화 약 1150원으로 32,000원에 구매했었습니다. 


물론 PVC가 아닌 제품도 있을 것 입니다. 재질에는 주의하셔서 선택해야 합니다. 

장점 : 
1) 접으면 약 1m 길이 두께 20cm 가량의 소형으로 3가지 형태 중 가장 작게 보관할 수 있다. 
2) 성인 남성 1인이 들어가기에 충분하며 여유 공간도 제법 있다. 
3) 저렴하다. 

단점 : 
1) PVC 제품의 경우 환경 호르몬에 대한 알레르기가 있는 경우 피부에 붉은 반점, 여드름 같은 것이 생긴다. (경험)
2) 내구성이 약하다. 약 20회 사용 후 누수 발생 


2. 이동형 


현재 인터넷에서 구매할 수 있는 가성비가 가장 뛰어난 제품인 것 같습니다.  2020년에 구매했던 제품입니다. PP 재질입니다. PP는 주방용기로 사용 될 만큼 안정성이 확보된 재질로 판단되고 있습니다. 또한 특정 제품에 한해서는 유해성 테스트를 수행한 결과를 첨부하여 팔고 있기 때문에 제법 안전하다고 할 수 있습니다. 다만 유사한 형태에도 PVC 재질의 제품이 있기 때문에 구입 시 재질과 안정성에 대한 검사 결과를 꼭 확인하셔야 합니다. 

욕실에 보관할 자리가 충분하다면 저렴한 가격에 안정성과 사용성이 뛰어난 제품입니다. 또한 재질도 내구성이 좋은편입니다. 

장점 : 
1) 가볍다 
2) 성인 남성이 목욕할 만큼 충분히 여유롭다. 
3) 저렴하다. 

단점 : 
1) 부피가 크다. 수납이 쉽지 않다. 

3. 접이형

가장 최근 구입했습니다. 주요 재질은 PP와 TPE입니다. PP는 위 욕조와 같지만 이 녀석은 TPE 재질이 추가되었습니다. TPE는 최근 떠오르는 고무 재질로 이 역시 안정성이 확보된 제품이라고 할 수 있습니다. 의료 용품이나 피부에 직접 닿는 제품까지 다양한 용도로 사용됩니다. 최근 3년 사이 가장 많이 보이는 재질입니다. 설명 상으로는 안정성과 내구성이 갖추어진 제품이라고 합니다. 

이 제품에서는 중간에 녹색 부분으로 되어있는 부분이 TPE이며 접고 펼치는 부분이 바로 TPE입니다.  다만 여기에서도 한 가지는 꼭 확인하셔야 합니다. 그래도 중국에서 오다 보니 국내 독성 시험 결과가 있는 곳에서 구매하는 것이 안전하다고 보입니다. 

TPE설명 사이트
장점 
1) 가볍다
2) 접을 수 있기에 보관 사이즈가 이동형보다 작다. 
3) 라인업이 다양하다. 전신욕, 반신욕, 유아, 강아지 

단점 
1) 사이즈가 줄어들긴 해도 튜브형 보단 크다. 
2) 접는 구조 때문에 목욕 후 뒤처리가 불편하다. 
(구조 사이 물이 고여있어서 말리는 시간이 필요하다.)


이상 사용해본 욕조 종류 별 특징에 대해 기술해보았습니다. 
누군가의 선택에 도움이 되었으면 좋겠습니다. 


2021년 2월 12일 금요일

POCO F2 PRO 에 LINEAGE 18.1 설치

개요 

 샤오미 미UI 12.2.4 버전에서 발생한 VOLTE 문제 이지만 사실 12.0.4버전에서도 LGU+의 경우 종종 신호를 잡지 못하는 현상이 발생하였고. volte에 대한 문제를 해결하고자 QPST도구를 통한 패치를 수행하려 하였으나 QPST 도구에서 기기가 인식은 되지만 파일을 열 수 없는 현상을 확인하였습니다. 

LineageOS에서는 volte를 지원하는 것을 페이지에서 확인하였으나, 실제로 설치해보니 지원되지 않는 것을 확인하였고. 따라서 안드로이드 11은 LG UPLUS 에서 제대로 지원되지 않는다.  라는 생각이 들 정도 입니다. 


글을 따라하시다가 휴대폰이 벽돌이 된다면 아래POCO F2 PRO 업데이트 후 LTE 오류로 인한 언락 및 설치 방법으로 하면 다시 초기버전의 휴대폰을 사용하실 수 있습니다. 

중요 : 현재 리니지OS 18.1에서도 VOLTE를 사용할 수 있다는 공지가 있어 설치해봤으나 VOLTE는 사용 불가능 상태에 빠집니다. LG U+입니다.


POCO F2 PRO 업데이트 후 LTE 오류로 인한 언락 및 설치 방법

POCO F2 PRO TWRP 설치와 루팅하기 

OS가 현재 사용 불가중일 경우 

MIUI_12.2.4_LIM_GLOBAL <- 링크를 통해 다운로드 하고 설치하셔도 됩니다. 


1. 설치 준비. 

설치를 하기 위해서는 우선 언락이 되어있어야 합니다. 그리고 miui 12.2.4

다운로드 파일은 아래와 같습니다. 

리니지 os 리커버리 이미지 파일 TWRP가 아닌 LINAGEOS 리커버리 파일이 필요합니다. 

리니지os 파일

안드로이드 ADB다운링크

사전에 저는 TWRP 설치를 위해 PLATFORM-TOOL을 다운로드 하였습니다. 참고로 LINEAGE OS 는 TWRP 없이 리니지 OS 리커버리를 통해 설치가 됩니다. 

위의 글로벌 롬, 그리고 리니지 os 리커버리 이미지, 리니지os 파일, adb를 받았다면 설치 준비는 모두 완료된 것 입니다. 


먼저 안드로이드 adb를 적당한 곳에 압축을 풉니다. 

저는 D드라이브에 XIAOMI 폴더를 만들고 그 밑에 풀었습니다. 

다음은 리지지 OS의 리커버리 파일과 OS 설치 파일을 모두 좀전에 압축을 푼 xiaomi 폴더 밑에 둡니다. 


2. 설치하기 

1) miui 12.2.4 버전을 설치. 

먼저 휴대폰을 종료한 후 전원버튼과 볼륨 다운 버튼을 동시에 눌러 fastboot로 부팅한 후 컴퓨터와 usb연결을 합니다. 

다음은 다운로드 받은 miui 12.2.4버전을 platform tool을 통해 열고 reflash 버튼을 눌러 장치 연결을 확인한 후 clean all 을 누르고 flash를 눌러 설치해줍니다. 

이 부분은 POCO F2 PRO 업데이트 후 LTE 오류로 인한 언락 및 설치 방법 와 동일하기에 영상을 캡처나 영상이 필요하시면 위 링크를 가보시면 됩니다. 


2) 리니지 os설치 

먼저 받은 recovery 이미지를 platform tool 폴더에 넣고 다음 명령을 수행합니다. 

fastboot flash recovery recovery.img 

fastboot boot recovery.img 





다음은 리니지 os메뉴에서 udpate > update ADB를 선택한 후 다음 명령을 수행합니다. 

>adb sideload [linage 파일 경로 ]




예 : >adb sideload d:\xiaomi\lineage-18.1-20210120-UNOFFICIAL-lmi.zip

용량이 작아서 이건 금방 업로드 됩니다. 

poco f2 pro 의 경우 커스텀롬이나 EU롬, CHIANA 롬 설치시 SIDELOAD를 이용해야 하는 것 같습니다. TWRP를 이용할 경우 인스톨 오류가 나서 중지되는 경우가 대부분입니다. 참고로 LINEAGE OS 의 경우 용량이 작아 금방 종료되었지만 EU 롬의 경우 30분가량 소요됩니다. USB 3.0을 사용해도 이정도네요. 


하지만 이렇게 설치해도 volte가 된다던 리니지os는 volte 가 먹통이었습니다. 

이상. 삽질기네요 -_- 젠장.. 17.1이나 깔아야겠습니다. 

2021년 2월 10일 수요일

POCO F2 PRO TWRP 설치와 루팅하기

개요 

 기왕 lte 끈김이 자주 발생하는 poco f2 pro 를 커스텀 롬과 lte 패치를 수행해보기로 결정했습니다. 그중 첫번째 단개인 twrp를 설치하고 루팅하는 단계까지에 대한 설명을 해보겠습니다. 루팅은 시스템의 최상위 권한을 가져온다는 말입니다. (최상위 계정이 보통 root 이기때문에 rooting이라고 합니다.) 

이 방법을 수행하면 휴대폰이 초기화되고, 여러 문제점이 생길 수 있으므로 읽는 분은 주의하셔야 하며 책임은 본인이 지셔야 합니다. 휴대폰이 벽돌이 될 수도 있다는 점 미리 공지해드립니다. 


TWRP를 설치하기 위해서는 먼저 언락 을 수행해야 합니다. 언락을 하지 않으셨다면 아래 링크를 참조하세요 

또한 벽돌이 되었다면 아래 링크로 정식롬을 다시 입히면 복구가 됩니다. 

POCO F2 업데이트 후 LTE 오류로 인한 언락 및 설치 방법


1. TWRP 설치준비 

언락이 완료되었다면 2가지의 파일을 다운로드 해야 합니다. 안드로이드 FASTBOOT 모드를 통해 파일을 설치한 ADB 도구와 TWRP 그리고 루팅을 하기 위한 Magisk를 다운받아야 합니다. 

안드로이드 ADB다운링크 <--를 클릭하셔서 정식 안드로이드 SDK도구를 다운 받으세요 자신의 컴퓨터 OS에 맞는 버전으로 받으시면 됩니다. 

TWRP 3.4.1B 파일 <---  클릭해서 다운로드  

Magisk-v20 .4.zip <---  클릭해서 다운로드  

먼저 다운로드 받은 안드로이드 ADB 도구 (platform-tools_r30.0.5-windows)의 압축을 풀어 컴퓨터의 적당한 위치에 넣어줍니다. 

전 D드라이브에 XIAOMI 폴더를 만들어서 넣었습니다. 

그리고 TWRP 파일과 magisk도 같은 폴더에 넣어줍니다. 


2. twrp설치 및 부팅하기 

다음은 windows 시작버튼을 눌러서 cmd 라고 치면 나오는 명령 프롬프트를 마우스 오른쪽 클릭해서 관리자 권한으로 실행해줍니다. 


그리고 설치한 위치로 이동합니다. 

저는 D:/xiaomi/platform-tool입니다. 이동커맨드는 cd이므로 아래와 같이 치시면 됩니다. 

d드라이브로 이동하려면 d:을 먼저 치면 됩니다. 

cd d:\xiaomi\platform-tools

위 커맨드를 칠때 폴더나 파일 명칭은 앞 철자를 누른 후 키보드의 tab 키를 입력하면 자동으로 완성됩니다. 

명령이 정상적으로 수행되었으면 위와같은 상태가 됩니다. 
dir 명령을 쳐서 전체를 확인해보면 다음과 같이 파일이 모두 있음을 확인할 수 있습니다.


다음은 pc와 휴대폰을 연결하기 위해 fastboot모드로 부팅해줍니다. 휴대폰을 종료하고 볼륨 아래 버튼과 전원을 동시에 누르면 쉽게 진행할 수 있습니다. 

다음으로는 adb 도구를 통해 twrp를 설치해줍니다. 
pc와 디바이스가 연결되어있으면 간단한 명령 두줄로 twrp를 설치하고 부팅할 수 있습니다. 

twrp 설치하기 

fastboot flash recovery twrp.img 

저의경우 twrp img파일 이름이 recovery-TWRP-3.4.1B-0328-REDMI_K30PRO-CN-wzsx150.img 이기 때문에 해당 명칭으로 작업하였습니다. 

twrp로 부팅하기 

fastboot boot twrp.img

설치가 정상적으로 완료되면 아래와 같이 twrp 화면을 휴대폰에서 보실 수 있습니다. 


다음은 매지스크 설치인데요 루트 권한을 갖기 위해 필요한 부분입니다. 

3. 매지스크 설치하기 

매지스크를 설치하기 전에 일단 휴대폰을 초기화 해야 합니다. twrp 내에서 진행하면 됩니다. 

다음 절차는 휴대폰 백업을 먼저 하신 후에 하시는 것을 권장합니다. 

1) 포멧하기 

pc에 폰이 연결된 상태에서 

fastboot boot twrp.img 명령을 통해 twrp 부팅을 합니다. 

저같은 경우는 

fastboot boot recovery-TWRP-3.4.1B-0328-REDMI_K30PRO-CN-wzsx150.img 

파일명칭이 다르기 때문에 본인이 설정한 명칭으로 해야 합니다. 

다음은 wife -> format data -> reboot 순입니다. 



2) 매지스크 설치하기 

휴대폰을 다시 TWRP로 부팅하여 다운로드 받은 매지스크 파일을 휴대폰에 넣습니다. redmi k30 pro 제품으로 내 컴퓨터에 잡히기 때문에 그냥 복사 붙여넣기 하시면 됩니다. 


파일이 붙여넣기 되면 이제 TWRP 화면에서 INSTALL 을 눌러 해당 ZIP파일을 Magisk 파일을 선택하고 슬라이드를 당겨 설치합니다. 

 



3) 재부팅 후 안드로이드 설정 

안드로이드 설정은 본인이 알아서 하실 거라 믿고 패스하겠습니다. 


4) 실행 및 업데이트하기 

앱 목록으로 들어가서 매지스크를 실행 -> 업데이트 -> 직접설치 -> 재부팅 순으로 수행하면 됩니다. 



5) 루트권한 체크하기 

루트체커라는 앱을 받아서 실제로 루트권한을 줄 수 있는지 확인하면 되는 간단한 절차 입니다. 



자 이상 이미지와 동영상 그리고 긴 글로 이루어진 twrp 설치와 루팅하기가 종료 되었습니다. 

읽어주셔서 감사합니다.