Java HashMap 파일 입출력 (File IO)

[펌] https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=lsj30224&logNo=220586099250

HashMap파일 입출력방법

출력 :

주의!!!    자료형처럼 쓰는 클래스는 Serializable 을 구현해야함

    public static void main(String[] args) {
        HashMap<String, Data> hm = new HashMap<String, Data>();
        
        hm.put("Key1", new Data(1, "Key1 String Value", true)); 
        
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("출력할 파일 이름"));
            oos.writeObject(hm);
            oos.close();
        } catch (IOException ex) {
            Logger.getLogger(Tester.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

입력 (위에서 출력한 파일 받아옴)

받아올때는 자료형 변환 해줘야 합니다.

(이것도 좀 기네요 오른쪽으로 스크롤 해주세요)

    public static void main(String[] args) {
        HashMap<String, Data> hm = new HashMap<String, Data>();
        
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("출력할 파일 이름"));
            hm = (HashMap<String, Data>) ois.readObject();   //캐스팅 해줘야됨
        } catch (IOException ex) {
            Logger.getLogger(Tester.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Tester.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        System.out.println("intval : "+hm.get("Key1").intval+", strval : "+hm.get("Key1").strval+", boolval : "+hm.get("Key1").boolval);
    }
 



IntelliJ, VSCode, Eclipse, Visual Studio 단축키

기능 IntelliJ VSCode Eclipse VS
자동 완성, 인텔리센스 Ctrl + Space Ctrl + Space Alt + Right
SmartType code completion Ctrl + Shift + Space
Reformat, Code Tidy Ctrl + Alt + L Ctrl + Alt + F Ctrl + Shift + F
Quick Fix Alt + Enter Ctrl + 1
Navigate | Declaration (Open Declaration) Ctrl + B F3
Go to file(Open Resource) Ctrl + Shift + N Ctrl + P Ctrl + Shift + R
Find in Path (Search Project) Ctrl + Shift + F Ctrl + H
Rename Shift + F6 F2 Ctrl + Alt + R F2 or Ctrl + R, R
Extract Variable Ctrl + Alt + V
Extract Method Ctrl + Alt + M
Quick Documentation Ctrl + Q F2
검색(형 기반의 전역 검색)
Go to class
Ctrl + N Ctrl + Shift + T Ctrl + ,
Go to symbol Ctrl + Alt + Shift + N
이전 작업 위치(이거 짱짱맨) Ctrl + Alt + ← Alt + ← Ctrl + –
다음 작업 위치(반대) Ctrl + Alt + → Alt + → Shift + Ctrl + –
코드 한 줄 혹은 선택 영역을 한 줄 위로 이동 Ctrl + Shift + ↑ Alt + ↑ Alt + ↑ Alt + ↑
코드 한 줄 혹은 선택 영역을 한 줄 아래로 이동 Ctrl + Shift + ↓ Alt + ↓ Alt + ↓ Alt + ↓
코드 한 줄 혹은 선택 영역 복사 Ctrl + D Ctrl + C
Alt + Shift + ↓
Ctrl + D Ctrl + C
기능 IntelliJ VSCode Eclipse VS
도구(메뉴나 다이얼로그 항목 등) 찾기
Search Action (Quick Access)
Ctrl + Shift + A Ctrl + Shift + P Ctrl + 3 Ctrl + Q
Search everywhere (Quick Search Plugin) Double Shift Ctrl + Shift + L
View Hierarchy (Show Hierarchy) Ctrl + H Ctrl + T
Find Usages (Find References) Alt + F7 Ctrl + Shift + G
Find Ctrl + F Ctrl + F Ctrl + F
Find next F3 Ctrl + K
Find previous Shift + F3 Ctrl + Shift + K
Replace Ctrl + R Ctrl + F
Find in path (Search) Ctrl + Shift + F Ctrl + H
문법 해결(네임스페이스 찾기/ 인터페이스 구현 등) Shift + Alt + F10
솔루션 탐색기 Ctrl + W, S
출력 창 Ctrl + ` Ctrl + W, O
솔루션 탐색기 검색 Ctrl + ;
주석 처리 Ctrl + / Ctrl + / Ctrl + / Ctrl + E, C
주석 제거 Ctrl + / Ctrl + / Ctrl + / Ctrl + E, U
코드 아웃라인(네임스페이스, 클래스, 메서드 등등) 토글 Ctrl + M, M
파일 내 전체 코드 아웃라인 토글 Ctrl + M, L
테스트 탐색기 Alt + S, W, T
(메뉴 단축키 경로)
팀 탐색기 Ctrl + , Ctrl + M
전체 테스트 실행 Ctrl + R, A
캐럿 기준 현재 테스트 실행 Ctrl + R, T
코드 렌즈 테스트 결과 팝업 Alt + 1



log4j2 환경설정 리로딩 구성

  • 알아야 될 지식
    • monitorInterval 를 설정하면 초단위로 리프레쉬 한다.
    • java jar run 시, 외부 config 폴더의 application.yml 을 참조한다.
      • config폴더는 jar 실행경로의 하위에 있어야 한다.
      • config 의 하위폴더가 하나라도 있어야 에러가 안남 (./config/*/ 점검함)
  • 구성
    • docker 이미지 수행 시, config 폴더를 외부 경로에 마운트 한다.
    • config 외부경로에 application.yml 을 만든다.
    • application.yml 안에 logging.config 를 설정한다.
      • logging.config=config/log4j2.yml
    • 설정된 log4j2 환경설정 파일을 만든다.
      • monitorInterval 을 설정한다.
  • 테스트
    • 외부파일 안만들 경우 점검
      • config 폴더에 아무 파일도 없이 docker 수행
      • 로깅메시지가 정상적으로 표현되는지 확인
    • 로그설정 리로딩 점검
      • docker 수행 후, 로깅메시지 형태를 확인
      • 외부 log4j2.yml 에서 로깅메시지 형태 변경
      • 설정된 시간 후, 로깅메시지 형태가 변경되어 표현되는지 확인



flatMap & concatMap & flatMapSequential

  • flatMap
    • 입력/출력 순서가 일치하지 않는다.
    • 내부 병렬처리
  • concatMap
    • 입력/출력 순서 일치
    • 내부 순차처리
      • 전체적으로 로직이 순서보장이 필요한 경우
  • flatMapSequential
    • 입력/출력 순서 일치
    • 내부 병렬처리
      • 전체적으로 순서가 필요하나, 내부처리가 순서보장이 필요없을 경우



httpclient 로깅

commons-httpclient-xx.xx.jar 사용 시, 로깅 방법

 <logger name=”httpclient.wire” level=”debug” />

org.apache.commons.httpclient.Wire 안의

public static Wire HEADER_WIRE = new Wire(LogFactory.getLog(“httpclient.wire.header”));

public static Wire CONTENT_WIRE = new Wire(LogFactory.getLog(“httpclient.wire.content”));




webclient 호출 및 reactive 응답처리

  • 이벤트 처리
    • doOnError() : 예외가 발생했을 경우, 특정 행위를 실행시킬 경우 사용
      • 에러 시, 처리 후 리턴되는지 다음건으로 이동되는지 확인 필요
      • 2xx 이 아닌 경우와 Exception 인 경우 call 됨
    • doOnSuccess() : 발송 성공 시, 후처리
    • onErrorReturn : 예외가 발생했을 때 특정 값을 Return 함
      • 정상과 같은 객체를 생성해서 특정값을 저장하고 중지 후 리턴
    • onErrorResume : 예외가 발생했을 때 다른 Flux형태로 Return 함
      • 정상과 같은 객체를 생성해서 특정값을 저장하고 다음 건 처리
    • onErrorContinue : 예외가 발생했을 때 멈추지 않고 해당 영역만 skip해서 동작함.
      • 에러처리 후 해당 건 스킵 및 다음 건 처리
public Mono<Object> doExec(
		ServerHttpRequest request, ServerHttpResponse clientResponse, RbcAuth rbcAuth) {

	String finalAuthToken = ...;

	try{
		return webClient.get()
				.uri(rbcUrl.getCategories())
				.accept(MediaType.APPLICATION_JSON)
				.headers(httpHeaders -> httpHeaders.setBearerAuth(finalAuthToken))
				.retrieve()
				.onStatus(HttpStatus::isError, res -> doError(res))
				.bodyToMono(CustomResult.class)
				.doOnError(ex -> doExcept(clientResponse, ex))
				.flatMap(res -> doSucc(clientResponse, res))
				.doOnSuccess(res -> doFinish(clientResponse, res))
				.subscribe()
				.log()
				;
	}catch (Exception e){
		log.error("webClient fail. e={}", e.getMessage(), e);
		return doExcept(clientResponse, e);
	}
}

private Mono<Object> doFinish(ServerHttpResponse response, CustomResult res) {
	...
	return Mono.just("finish");
}

private Mono<Object> doSucc(ServerHttpResponse response, CustomResult res) {
	...
	return Mono.just("success");
}

private Mono<Object> doExcept(ServerHttpResponse response, Throwable ex) {
	...
	return Mono.just("fail. e={}", e.getmessage());
}

private Mono<Exception> doError(ClientResponse res) {
	if (res.statusCode().isError()) {
		return Mono.error(new RuntimeException(res.toString()));
	}
	else{
		return Mono.error(new RuntimeException(res.toString()));
	}
}