
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
<?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">
<!--
작성자 : takensoft
작성일 : 2024.04.03
내 용 : 회원정보 관련
-->
<mapper namespace="com.takensoft.cms.mber.dao.MberDAO">
<!-- 회원 정보 resultMap(권한 포함) -->
<resultMap id="mberMap" type="MberVO">
<result property="mbrId" column="mbr_id" />
<result property="lgnId" column="lgn_id" />
<result property="mbrNm" column="mbr_nm" />
<result property="ncnm" column="ncnm" />
<result property="pswd" column="pswd" />
<result property="mblTelno" column="mbl_telno" />
<result property="telno" column="telno" />
<result property="eml" column="eml" />
<result property="zip" column="zip" />
<result property="addr" column="addr" />
<result property="daddr" column="daddr" />
<result property="mbrStts" column="mbr_stts" />
<result property="useYn" column="use_yn" />
<result property="cntrlDt" column="cntrl_dt" />
<result property="cntrlRsn" column="cntrl_rsn" />
<result property="smsRcptnAgreYn" column="sms_rcptn_agre_yn" />
<result property="emlRcptnAgreYn" column="eml_rcptn_agre_yn" />
<result property="prvcRlsYn" column="prvc_rls_yn" />
<result property="mbrType" column="mbr_type" />
<result property="pswdChgDt" column="pswd_chg_dt" />
<result property="frstRegIp" column="frst_reg_ip" />
<result property="sysPvsnYn" column="sys_pvsn_yn" />
<result property="rgtr" column="rgtr" />
<result property="regDt" column="reg_dt" />
<result property="mdfr" column="mdfr" />
<result property="mdfcnDt" column="mdfcn_dt" />
<collection property="authorList" column="{mbrId = mbr_id}" javaType="java.util.ArrayList" ofType="MberAuthorVO" select="findByMberAuthor" />
</resultMap>
<!-- 회원, 권한 매핑 -->
<resultMap id="authMap" type="MberAuthorVO">
<result property="mbrId" column="mbr_id" />
<result property="authrtNm" column="authrt_nm" />
<result property="authrtCd" column="authrt_cd" />
<result property="rgtr" column="rgtr" />
<result property="regDt" column="reg_dt" />
</resultMap>
<!-- 소셜 계정 정보 resultMap -->
<resultMap id="socialAccountMap" type="MberSocialAccountVO">
<result property="id" column="id" />
<result property="mbrId" column="mbr_id" />
<result property="providerType" column="provider_type" />
<result property="socialId" column="social_id" />
<result property="loginId" column="login_id" />
<result property="socialEmail" column="social_email" />
<result property="socialName" column="social_name" />
<result property="isPrimaryProfile" column="is_primary_profile" />
<result property="isActive" column="is_active" />
<result property="linkedDt" column="linked_dt" />
<result property="unlinkedDt" column="unlinked_dt" />
<result property="rgtr" column="rgtr" />
<result property="regDt" column="reg_dt" />
<result property="mdfr" column="mdfr" />
<result property="mdfcnDt" column="mdfcn_dt" />
</resultMap>
<sql id="selectMber">
SELECT mi.mbr_id
, mi.lgn_id
, mi.mbr_nm
, mi.ncnm
, mi.pswd
, mi.mbl_telno
, mi.telno
, mi.eml
, mi.zip
, mi.addr
, mi.daddr
, mi.mbr_stts
, mi.use_yn
, TO_CHAR(mi.cntrl_dt, 'YYYY-MM-DD') AS cntrl_dt
, mi.cntrl_rsn
, mi.sms_rcptn_agre_yn
, mi.eml_rcptn_agre_yn
, mi.prvc_rls_yn
, mi.mbr_type
, TO_CHAR(mi.pswd_chg_dt, 'YYYY-MM-DD HH24:MI') AS pswd_chg_dt
, mi.frst_reg_ip
, mi.sys_pvsn_yn
, mi.rgtr
, TO_CHAR(mi.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
, mi.mdfr
, TO_CHAR(mi.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
FROM mbr_info mi
</sql>
<!--
작성자 : takensoft
내 용 : 회원정보 조회 [security 용] - 통합 로그인 대응
-->
<select id="findByMberSecurity" parameterType="String" resultMap="mberMap">
<include refid="selectMber" />
WHERE EXISTS (
SELECT 1 FROM mbr_social_accounts msa
WHERE msa.mbr_id = mi.mbr_id
AND (
(msa.provider_type = 'S' AND msa.login_id = #{lgnId})
OR (msa.provider_type != 'S' AND msa.social_id = #{lgnId})
)
AND msa.is_active = true
)
AND mi.use_yn = 'Y'
LIMIT 1
</select>
<!--
통합 로그인: 제공자별 사용자 조회
-->
<select id="findByUnifiedLogin" parameterType="map" resultMap="mberMap">
<include refid="selectMber" />
WHERE EXISTS (
SELECT 1 FROM mbr_social_accounts msa
WHERE msa.mbr_id = mi.mbr_id
<if test="providerType == 'S'">
AND msa.provider_type = 'S'
AND msa.login_id = #{identifier}
</if>
<if test="providerType != 'S'">
AND msa.provider_type = #{providerType}
AND msa.social_id = #{identifier}
</if>
AND msa.is_active = true
)
AND mi.use_yn = 'Y'
AND mi.mbr_stts = '1'
LIMIT 1
</select>
<!--
작성자 : takensoft
작성일 : 2024.04.03
내 용 : 로그인 아이디 중복 확인 - 통합 로그인 대응
-->
<select id="findByCheckLoginId" parameterType="String" resultType="boolean">
SELECT COUNT(*) > 0
FROM mbr_social_accounts msa
JOIN mbr_info mi ON msa.mbr_id = mi.mbr_id
WHERE msa.provider_type = 'S'
AND msa.login_id = #{lgnId}
AND msa.is_active = true
AND mi.use_yn = 'Y'
</select>
<!--
작성자 : takensoft
작성일 : 2024.04.03
내 용 : 회원가입
-->
<insert id="save" parameterType="JoinDTO">
INSERT INTO mbr_info (
mbr_id
, lgn_id
, mbr_nm
, ncnm
, pswd
, mbl_telno
, telno
, eml
, zip
, addr
, daddr
, mbr_stts
, use_yn
, cntrl_dt
, cntrl_rsn
, sms_rcptn_agre_yn
, eml_rcptn_agre_yn
, prvc_rls_yn
, mbr_type
, pswd_chg_dt
, frst_reg_ip
, sys_pvsn_yn
, rgtr
, reg_dt
) VALUES (
#{mbrId}
, #{lgnId}
, #{mbrNm}
, #{ncnm}
, #{pswd}
, #{mblTelno}
, #{telno}
, #{eml}
, #{zip}
, #{addr}
, #{daddr}
, #{mbrStts}
, 'Y'
, #{cntrlDt}::timestamp
, #{cntrlRsn}
, #{smsRcptnAgreYn}
, #{emlRcptnAgreYn}
, #{prvcRlsYn}
, #{mbrType}
, NOW()
, #{frstRegIp}
, '1'
, #{rgtr}
, NOW()
)
</insert>
<!--
작성자 : takensoft
작성일 : 2024.04.03
내 용 : 회원 권한 등록
-->
<insert id="authorSave" parameterType="MberAuthorVO">
INSERT INTO mbr_authrt_info (
mbr_id
, authrt_cd
, rgtr
, reg_dt
) VALUES (
#{mbrId}
, #{authrtCd}
, #{rgtr}
, NOW()
)
</insert>
<!--
작성자 : takensoft
작성일 : 2024.04.15
내 용 : 비밀번호 변경
-->
<update id="updatePassword" parameterType="PasswordDTO">
UPDATE mbr_info
SET pswd = #{newPswd}
, mdfr = #{mdfr}
, mdfcn_dt = NOW()
WHERE mbr_id = #{mbrId}
</update>
<!--
작성자 : takensoft
작성일 : 2024.04.15
내 용 : 회원정보 조회
-->
<select id="findByMber" parameterType="String" resultMap="mberMap">
<include refid="selectMber" />
WHERE mi.mbr_id = #{mbrId}
AND mi.use_yn = 'Y'
</select>
<!--
작성자 : takensoft
작성일 : 2024.04.03
내 용 : 회원 권한 정보 조회
-->
<select id="findByMberAuthor" parameterType="MberVO" resultMap="authMap">
SELECT mai.mbr_id
, mai.authrt_cd
, mai.rgtr
, TO_CHAR(mai.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
FROM mbr_authrt_info mai
WHERE mai.mbr_id = #{mbrId}
</select>
<!-- 이메일로만 사용자 조회 -->
<select id="findByEmail" parameterType="String" resultType="MberVO">
SELECT
m.mbr_id as mbrId,
m.lgn_id as lgnId,
m.mbr_nm as mbrNm,
m.ncnm,
m.pswd,
m.mbl_telno as mblTelno,
m.telno,
m.eml,
m.zip,
m.addr,
m.daddr,
m.mbr_stts as mbrStts,
m.use_yn as useYn,
m.cntrl_dt as cntrlDt,
m.cntrl_rsn as cntrlRsn,
m.sms_rcptn_agre_yn as smsRcptnAgreYn,
m.eml_rcptn_agre_yn as emlRcptnAgreYn,
m.prvc_rls_yn as prvcRlsYn,
m.mbr_type as mbrType,
m.pswd_chg_dt as pswdChgDt,
m.frst_reg_ip as frstRegIp,
m.sys_pvsn_yn as sysPvsnYn,
m.rgtr,
m.reg_dt as regDt,
m.mdfr,
m.mdfcn_dt as mdfcnDt
FROM mbr_info m
WHERE m.eml = #{email}
AND m.use_yn = 'Y'
AND m.mbr_stts = '1'
</select>
<!-- 이메일과 회원 유형으로 사용자 조회 -->
<select id="findByEmailAndProvider" parameterType="map" resultMap="mberMap">
<include refid="selectMber" />
WHERE mi.eml = #{email}
AND mi.mbr_type = #{mbrType}
AND mi.use_yn = 'Y'
AND mi.mbr_stts = '1'
</select>
<!-- 회원 ID로 권한 목록 조회 -->
<select id="findAuthoritiesByMbrId" parameterType="String" resultMap="authMap">
SELECT mai.mbr_id
, mai.authrt_cd
, mai.rgtr
, TO_CHAR(mai.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
FROM mbr_authrt_info mai
WHERE mai.mbr_id = #{mbrId}
</select>
<!-- OAuth2 사용자 저장 -->
<insert id="saveOAuthUser" parameterType="MberVO">
INSERT INTO mbr_info (
mbr_id,
lgn_id,
mbr_nm,
ncnm,
eml,
mbr_stts,
use_yn,
sms_rcptn_agre_yn,
eml_rcptn_agre_yn,
prvc_rls_yn,
mbr_type,
sys_pvsn_yn,
rgtr,
reg_dt
) VALUES (
#{mbrId},
#{lgnId},
#{mbrNm},
#{ncnm},
#{eml},
#{mbrStts},
#{useYn},
'N',
'N',
'N',
#{mbrType},
#{sysPvsnYn},
#{rgtr},
NOW()
)
</insert>
<!-- OAuth2 사용자 정보 업데이트 -->
<update id="updateOAuthUser" parameterType="MberVO">
UPDATE mbr_info
SET
mbr_nm = #{mbrNm},
ncnm = #{ncnm},
mdfr = #{mdfr},
mdfcn_dt = NOW()
WHERE mbr_id = #{mbrId}
</update>
<!-- 기존 계정에 OAuth2 정보 연동 -->
<update id="linkOAuth2Account" parameterType="MberVO">
UPDATE mbr_info
SET
mbr_type = #{mbrType},
mdfr = #{mdfr},
mdfcn_dt = NOW()
WHERE mbr_id = #{mbrId}
</update>
<!-- 소셜 계정 정보 저장 -->
<insert id="saveSocialAccount" parameterType="MberSocialAccountVO">
INSERT INTO mbr_social_accounts (
mbr_id,
provider_type,
social_id,
login_id,
social_email,
social_name,
is_primary_profile,
is_active,
rgtr
) VALUES (
#{mbrId},
#{providerType},
#{socialId},
#{loginId},
#{socialEmail},
#{socialName},
#{isPrimaryProfile},
#{isActive},
#{rgtr}
)
</insert>
<!-- 이메일로 모든 연동 계정 조회 -->
<select id="findAllAccountsByEmail" parameterType="String" resultMap="mberMap">
<include refid="selectMber" />
WHERE mi.eml = #{email}
AND mi.use_yn = 'Y'
AND mi.mbr_stts = '1'
LIMIT 1
</select>
<!-- 회원 ID로 소셜 계정 목록 조회 -->
<select id="findSocialAccountsByMbrId" parameterType="String" resultMap="socialAccountMap">
SELECT id, mbr_id, provider_type, social_id, login_id, social_email, social_name,
is_primary_profile, is_active, linked_dt, unlinked_dt, rgtr, reg_dt, mdfr, mdfcn_dt
FROM mbr_social_accounts
WHERE mbr_id = #{mbrId}
AND is_active = true
ORDER BY is_primary_profile DESC, linked_dt ASC
</select>
<!-- 특정 제공자로 소셜 계정 조회 -->
<select id="findSocialAccountByProvider" parameterType="map" resultMap="socialAccountMap">
SELECT id, mbr_id, provider_type, social_id, login_id, social_email, social_name,
is_primary_profile, is_active, linked_dt, unlinked_dt, rgtr, reg_dt, mdfr, mdfcn_dt
FROM mbr_social_accounts
WHERE mbr_id = #{mbrId}
AND provider_type = #{providerType}
AND is_active = true
</select>
<!-- 소셜 계정 연동 -->
<insert id="linkSocialAccount" parameterType="MberSocialAccountVO">
INSERT INTO mbr_social_accounts (
mbr_id,
provider_type,
social_id,
login_id,
social_email,
social_name,
is_primary_profile,
is_active,
rgtr
) VALUES (
#{mbrId},
#{providerType},
#{socialId},
#{loginId},
#{socialEmail},
#{socialName},
#{isPrimaryProfile},
#{isActive},
#{rgtr}
)
ON CONFLICT (mbr_id, provider_type)
DO UPDATE SET
social_id = #{socialId},
login_id = #{loginId},
social_email = #{socialEmail},
social_name = #{socialName},
is_active = true,
unlinked_dt = NULL,
mdfr = #{rgtr},
mdfcn_dt = NOW()
</insert>
<!-- 소셜 계정 연동 해지 -->
<update id="unlinkSocialAccount" parameterType="map">
UPDATE mbr_social_accounts
SET is_active = false,
unlinked_dt = NOW(),
mdfr = #{mdfr},
mdfcn_dt = NOW()
WHERE mbr_id = #{mbrId}
AND provider_type = #{providerType}
</update>
<!-- 메인 프로필 설정 -->
<update id="setPrimaryProfile" parameterType="map">
<!-- 기존 메인 프로필 해제 -->
UPDATE mbr_social_accounts
SET is_primary_profile = false,
mdfr = #{mdfr},
mdfcn_dt = NOW()
WHERE mbr_id = #{mbrId}
AND is_primary_profile = true;
<!-- 새로운 메인 프로필 설정 -->
UPDATE mbr_social_accounts
SET is_primary_profile = true,
mdfr = #{mdfr},
mdfcn_dt = NOW()
WHERE mbr_id = #{mbrId}
AND provider_type = #{providerType}
AND is_active = true;
</update>
<!-- 연동 가능한 계정 조회 (이메일로 검색, 다른 제공자 제외) -->
<select id="findLinkableAccount" parameterType="map" resultMap="mberMap">
<include refid="selectMber" />
WHERE mi.eml = #{email}
AND mi.use_yn = 'Y'
AND mi.mbr_stts = '1'
AND NOT EXISTS (
SELECT 1 FROM mbr_social_accounts msa
WHERE msa.mbr_id = mi.mbr_id
AND msa.provider_type = #{providerType}
AND msa.is_active = true
)
LIMIT 1
</select>
</mapper>