diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/McpRequestHeaderFilter.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/McpRequestHeaderFilter.java index b7c8d8962..429223496 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/McpRequestHeaderFilter.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/McpRequestHeaderFilter.java @@ -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 { diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/session/mci/AxhubSessionService.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/session/mci/AxhubSessionService.java new file mode 100644 index 000000000..c50066d6d --- /dev/null +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/session/mci/AxhubSessionService.java @@ -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; + } +} diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/session/mci/ONBSA0790_I.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/session/mci/ONBSA0790_I.java new file mode 100644 index 000000000..d49065c10 --- /dev/null +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/session/mci/ONBSA0790_I.java @@ -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; + } +} diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/session/mci/ONBSA0790_O.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/session/mci/ONBSA0790_O.java new file mode 100644 index 000000000..ea51d2380 --- /dev/null +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/session/mci/ONBSA0790_O.java @@ -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; + + @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; + } +} diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/SessionUtil.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/SessionUtil.java index e155b9811..e4217a88a 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/SessionUtil.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/SessionUtil.java @@ -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); }