= 개인정보 사용 이력 관리

== 개요
사용자 정보를 조회한 이력을 남긴다. 관련 법에 따라 일정기간 동안 보관한다.

=== 사용자 정보 조회 이력 관리
* UserController에서 사용자 정보 관련 메서드 호출시, UserService의 writeUserHistoryLog 메서드를 호출하고 있다.
* log4j2.xml에 설정한 파일에 이력이 남는다.

.UserController.class
[source,java]
----
    @Operation(summary = "사용자 목록 조회")
    @GetMapping("/auth/users")
    public PagingResult<User> getUserPagingList( @ModelAttribute UserSearchDto searchDto) {

        PagingResult<User> resultPage = userService.getUserPagingList(searchDto);

        // 개인정보조회 이력 남김
        userService.writeUserHistoryLog(resultPage);
        
        return resultPage;
    }
    
    @Operation(summary = "사용자 조회 (by EP ID)")
    @GetMapping("/auth/users/{userId}")
    public User userInfo(@Parameter(description = "EP ID", required = true) @PathVariable(required = true) String userId) {
    	
    	User userInfo = userService.getUserById(userId);
    	
    	// 개인정보조회 이력 남김
        userService.writeUserHistoryLog(userInfo);
        
        return userInfo;
    }
----

.UserServiceImpl.class
[source,java]
----
    @Override
	public void writeUserHistoryLog(Object returnValue) {
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
		String requestUri = request.getRequestURI();
		String requestMethod = request.getMethod();
		User user = Account.currentUser();
		if(ObjectUtils.isNotEmpty(user)) {	// 로그인된 사용자
			try {
				HistoryLog log = new HistoryLog();
				log.setLogId(idGenService.getNextStringId());
				log.setNodeId(nodeId);
				if(ObjectUtils.isNotEmpty(user)) {
					log.setWorkerId(user.getUserId());
					log.setWorkerName(user.getUserName());
				}
				log.setWorkDatetime(DateTime.now().toString());
				log.setRemoteAddr(webUtil.getClientIp(request));
				log.setRequestMethod(requestMethod);
				log.setRequestUri(requestUri);
				log.setApiResult(returnValue);
				
				String jsonVal = mapper.writeValueAsString(log);
				USER_HISTORY_LOG.info(jsonVal);
			} catch (JsonProcessingException e) {
				log.warn(e.getMessage());
			}
		}
	}
----

.log4j2.xml
[source,xml]
----
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <RollingFile name="UserHistoryAppender" fileName="/logs/history/user-history-${date:yyyy-MM-dd}-${hostName}.log"
                     filePattern="/logs/history/user-history-%d{yyyy-MM-dd}-${hostName}.log">
            <PatternLayout>
                <Pattern>%d %-5p [%t] %-17c{2} \(%13F:%L\) - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="UserHistoryLog" level="INFO" additivity="false">
            <AppenderRef ref="UserHistoryAppender"/>
        </Logger>
    </Loggers>
</Configuration>
----