feat: implement MCI session fetching using employee number
All checks were successful
Deploy Tools / deploy (push) Successful in 1m28s

This commit is contained in:
jade
2026-08-19 16:41:01 +09:00
parent a8363fae1e
commit 2e9a0d6005
5 changed files with 168 additions and 3 deletions

View File

@@ -7,11 +7,17 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import io.shinhanlife.dap.lib.session.mci.AxhubSessionService;
import io.shinhanlife.dap.lib.session.dto.SessionDto;
import org.springframework.beans.factory.annotation.Autowired;
/** Captures optional correlation and employee headers for an MCP HTTP call. */
/** Captures optional correlation and employee headers for an MCP HTTP call and creates mock session. */
@Component
public class McpRequestHeaderFilter extends OncePerRequestFilter {
@Autowired
private AxhubSessionService sessionService;
@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
return !request.getRequestURI().endsWith("/mcp");
@@ -20,12 +26,24 @@ public class McpRequestHeaderFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String empNo = request.getHeader("employee-no");
McpRequestHeaderContext.set(new McpRequestHeaders(
request.getHeader("x-request-id"),
request.getHeader("guid"),
request.getHeader("mcp-session-id"),
request.getHeader("employee-no"),
empNo,
request.getHeader("virtual-employee-no")));
// Fetch session info via MCI using employee-no
if (empNo != null && !empNo.isEmpty()) {
SessionDto sessionDto = sessionService.fetchUserSession(empNo);
if (sessionDto != null) {
// Set to request attribute so SessionUtil can find it
request.setAttribute("userInfo", sessionDto);
}
}
try {
filterChain.doFilter(request, response);
} finally {

View File

@@ -0,0 +1,59 @@
package io.shinhanlife.dap.lib.session.mci;
import io.shinhanlife.dap.lib.integration.mci.component.AxhubMciComponent;
import io.shinhanlife.dap.lib.session.dto.SessionDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
@Slf4j
@Service
@RequiredArgsConstructor
public class AxhubSessionService {
private final AxhubMciComponent mciComponent;
public SessionDto fetchUserSession(String employeeNo) {
if (employeeNo == null || employeeNo.trim().isEmpty()) {
return null;
}
try {
ONBSA0790_I request = ONBSA0790_I.builder()
.plnrPrafScrnInqrInDto(ONBSA0790_I.PlnrPrafScrnInqrInDto.builder()
.prafNo(employeeNo)
.build())
.build();
// callTo makes a synchronous MCI call.
var responseTransfer = mciComponent.callTo("ONBSA0790", "ONBSA", request, ONBSA0790_O.class);
ONBSA0790_O response = responseTransfer.getBody();
if (response != null && response.getPrafInfoDto() != null && !response.getPrafInfoDto().isEmpty()) {
ONBSA0790_O.PrafInfoDto info = response.getPrafInfoDto().get(0);
SessionDto sessionDto = new SessionDto();
sessionDto.setOgnzNo(info.getOgnzAsrtCd());
sessionDto.setPrafNo(info.getPrafNo());
sessionDto.setStrYmd(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
sessionDto.setBrafNo(info.getBrafNo());
sessionDto.setPsmrAsrtCd(info.getPsmrAsrtCd());
sessionDto.setSbsnRulpAsrtCd(info.getSbsnRulpAsrtCd());
sessionDto.setBsduCd(info.getBsduCd());
sessionDto.setBsquCd(info.getBsquCd());
sessionDto.setOgnzAsrtCd(info.getOgnzAsrtCd());
sessionDto.setOgnzLeveCd(info.getOgnzLeveCd());
log.info("[AxhubSessionService] MCI ONBSA0790 조회 성공: 사번={}, 조직코드={}", employeeNo, info.getOgnzAsrtCd());
return sessionDto;
}
} catch (Exception e) {
log.error("[AxhubSessionService] MCI ONBSA0790 사원 정보 조회 실패 (사번: {})", employeeNo, e);
}
return null;
}
}

View File

@@ -0,0 +1,25 @@
package io.shinhanlife.dap.lib.session.mci;
import io.shinhanlife.glow.communication.module.mci.annotation.GlowTrgmField;
import lombok.*;
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ONBSA0790_I {
@GlowTrgmField(order = 1, length = 100, description = "설계사인사화면조회입력DTO")
private PlnrPrafScrnInqrInDto plnrPrafScrnInqrInDto;
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class PlnrPrafScrnInqrInDto {
@GlowTrgmField(order = 1, length = 7, description = "인사번호")
private String prafNo;
}
}

View File

@@ -0,0 +1,53 @@
package io.shinhanlife.dap.lib.session.mci;
import io.shinhanlife.glow.communication.module.mci.annotation.GlowTrgmField;
import lombok.*;
import java.util.List;
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ONBSA0790_O {
@GlowTrgmField(order = 1, length = 1000, description = "인사정보DTO리스트")
private List<PrafInfoDto> prafInfoDto;
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class PrafInfoDto {
@GlowTrgmField(order = 1, length = 7, description = "인사번호")
private String prafNo;
@GlowTrgmField(order = 2, length = 2, description = "인사유형코드")
private String prafTypeCd;
@GlowTrgmField(order = 3, length = 100, description = "인사명")
private String prafNm;
@GlowTrgmField(order = 22, length = 3, description = "영업직책코드")
private String bsduCd;
@GlowTrgmField(order = 28, length = 6, description = "조직분류코드")
private String ognzAsrtCd;
@GlowTrgmField(order = 29, length = 6, description = "인사조직분류코드")
private String psmrAsrtCd;
@GlowTrgmField(order = 30, length = 6, description = "영업규정분류코드")
private String sbsnRulpAsrtCd;
@GlowTrgmField(order = 31, length = 6, description = "조직레벨코드")
private String ognzLeveCd;
@GlowTrgmField(order = 32, length = 7, description = "지점번호")
private String brafNo;
@GlowTrgmField(order = 33, length = 7, description = "영업소코드")
private String bsquCd;
}
}

View File

@@ -1,6 +1,7 @@
package io.shinhanlife.dap.lib.util;
import io.shinhanlife.dap.lib.session.dto.SessionDto;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@@ -28,7 +29,16 @@ public class SessionUtil {
public static SessionDto getSession() {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes == null) return null;
HttpSession session = attributes.getRequest().getSession(false);
// 1. Check HTTP Request Attribute first (populated by McpRequestHeaderFilter)
HttpServletRequest request = attributes.getRequest();
SessionDto requestSession = (SessionDto) request.getAttribute(SESSION_KEY);
if (requestSession != null) {
return requestSession;
}
// 2. Fallback to standard HttpSession
HttpSession session = request.getSession(false);
if (session == null) return null;
return (SessionDto) session.getAttribute(SESSION_KEY);
}