feat: 구글 로그인 — 같은 이메일이면 기존 계정에 자동 연결
CI / build (push) Failing after 14m59s

- member.google_id 컬럼 추가(멱등 ALTER) + 기존 GOOGLE 계정 sub 백필
- googleLogin: google_id 조회 → 없으면 검증된 동일 이메일 계정(LOCAL 우선)에
  연결 → 그래도 없으면 신규 생성. provider 는 유지(아이디 로그인/프로필 편집 보존)
- MemberMapper: findByGoogleId/findByEmailForLink/linkGoogle 추가, google_id 매핑

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ByungCheol
2026-06-27 19:01:57 +09:00
parent 09efd65fa9
commit b48d8c667c
5 changed files with 62 additions and 6 deletions
+23 -3
View File
@@ -11,6 +11,7 @@
<result property="email" column="email"/>
<result property="provider" column="provider"/>
<result property="providerId" column="provider_id"/>
<result property="googleId" column="google_id"/>
<result property="role" column="role"/>
<result property="status" column="status"/>
<result property="createdAt" column="created_at"/>
@@ -18,7 +19,7 @@
</resultMap>
<sql id="columns">
id, login_id, password, name, email, provider, provider_id, role, status, created_at, updated_at
id, login_id, password, name, email, provider, provider_id, google_id, role, status, created_at, updated_at
</sql>
<select id="findById" parameterType="long" resultMap="memberResultMap">
@@ -39,15 +40,34 @@
WHERE provider = #{provider} AND provider_id = #{providerId}
</select>
<!-- 구글 sub 로 회원 조회 (연결된 LOCAL 계정 + 순수 구글 계정 모두 google_id 로 찾음) -->
<select id="findByGoogleId" parameterType="string" resultMap="memberResultMap">
SELECT <include refid="columns"/> FROM member WHERE google_id = #{googleId}
</select>
<!-- 구글 로그인 시 같은 이메일의 기존 계정 1건(연결 대상). LOCAL 계정 우선. -->
<select id="findByEmailForLink" parameterType="string" resultMap="memberResultMap">
SELECT <include refid="columns"/>
FROM member
WHERE email = #{email} AND status = 'ACTIVE' AND google_id IS NULL
ORDER BY (provider = 'LOCAL') DESC, id ASC
LIMIT 1
</select>
<!-- 기존 계정에 구글 연결 (provider 는 그대로 유지) -->
<update id="linkGoogle">
UPDATE member SET google_id = #{googleId}, updated_at = NOW() WHERE id = #{id}
</update>
<select id="countByLoginId" parameterType="string" resultType="int">
SELECT COUNT(*) FROM member WHERE login_id = #{loginId}
</select>
<insert id="insert" parameterType="com.sb.web.auth.domain.Member"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO member (login_id, password, name, email, provider, provider_id, role, status, created_at, updated_at)
INSERT INTO member (login_id, password, name, email, provider, provider_id, google_id, role, status, created_at, updated_at)
VALUES (#{loginId}, #{password}, #{name}, #{email},
#{provider}, #{providerId}, #{role}, #{status}, NOW(), NOW())
#{provider}, #{providerId}, #{googleId}, #{role}, #{status}, NOW(), NOW())
</insert>
<update id="updatePassword">