Python/Database

[Python MySQL] 회원가입, 로그인, 회원정보 수정, 회원 탈퇴 프로그램 만들기

sdesign416 2026. 6. 9. 17:17

https://sdesign416.tistory.com/44

 

[Python MySQL] Python에서 MySQL 연결하고 데이터 조회하기

Python 설치부터 VSCode, Jupyter, venv설정까지파이썬을 시작하기 앞서가장 중요한 것은 개발환경 설정이다. Python 설치, VSCode 확장 프로그램, venv 가상환경까지 한 번에 등장하다보니각 역할이 무엇인

sdesign416.tistory.com


1) 회원가입 프로그램 만들기 (INSERT)

  • 정보는 input함수로 입력받는다.
  • 반복문을 사용하여 여러 회원을 가입받을 수 있도록 한다.
  • 추가 가입 여부를 물은 후 y를 입력 시 추가 회원가입을 진행한다.

1_1) 기본 조건 

# 데이터베이스 사용 선언
import MySQLdb 

# 데이터베이스 연결
db = MySQLdb.connect(host='localhost', user='root', password='1234', db='ai')
# 커서 생성 (SQL 실행 객체)
cur = db.cursor()

 

1_2) SQL문 작성

회원가입은 데이터를 추가하는것이기 때문에 INSERT 사용

sql = "insert into Mytest (userid, userpw, name, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3) 
values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"

 

1_3) data값 추가

실제로 넣을 data값 입력

data = (userid, userpw, name, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3)

 

1_4) 반영, 성공메세지 출력

# SQL 실행 : 데이터베이스에 전달
cur.execute(sql, data)

# 실제 DB에 변경사항 반영
db.commit()

# 출력
print("가입되었습니다!")

 

1_5) 추가 가입 여부

yn = input('추가로 가입하시겠습니까? (y/n): ')
    if yn.lower() == 'n':
    	# n입력 : 종료 = 추가가입 없다는 뜻
        print('프로그램을 종료합니다')
        break

💡 최종코드

db = MySQLdb.connect(host='localhost', user='root', password='1234', db='ai')
cur = db.cursor()

while True:
    try:
        userid = input('아이디를 입력하세요: ')
        userpw = input('비밀번호를 입력하세요: ')
        name = input('이름을 입력하세요: ')
        hp = input('전화번호를 입력하세요: ')
        email = input('이메일을 입력하세요: ')
        ssn1 = input('주민등록번호 앞자리를 입력하세요: ')
        ssn2 = input('주민등록번호 뒷자리를 입력하세요: ')
        zipcode = input('우편번호를 입력하세요: ')
        address1 = input('주소를 입력하세요: ')
        address2 = input('상세주소를 입력하세요: ')
        address3 = input('참고사항 입력하세요: ')
        gender = input('성별을 입력하세요(남자 또는 여자): ')

        sql = "insert into Mytest (userid, userpw, name, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3) values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
        data = (userid, userpw, name, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3)
        cur.execute(sql, data)
        
        db.commit()
        print('가입되었습니다!')
        yn = input('추가로 가입하시겠습니까? (y/n): ')
        if yn.lower() == 'n':
            print('프로그램을 종료합니다')
            break
    except Exception as e:
        print('다시 입력하세요')

cur.close()
db.close()

실행결과 예시▶


2) 로그인 프로그램 만들기_기본 (SELECT)

  • 아이디와 비밀번호를 입력받아 로그인을 한다.
  • 기본조건은 회원가입 프로그램과 동일하다.

2_1) 아이디, 비밀번호 입력받기

# 사용자 입력 (아이디)
userid = input('아이디를 입력하세요')

# 사용자 입력 (비밀번호)
userpw = input('비밀번호를 입력하세요')

 

2_2) 로그인 확인하기

select를 활용하여 입력받은 정보가 있는지 없는지 조회

# 아이디 + 비밀번호 일치하는 idx 조회하기
sql = "select idx from Mytest where userid=%s and userpw=%s"

 

2_3) 데이터추가, 결과 개수 반환

SELECT 문으로 확인 한 데이터의 값을 data에 넣고(튜플 형태로 전달받음)

SQL을 실행하여 결과 행 개수를 반환한다.

# SQL에 데이터 추가
data = (userid, userpw)

# SQL 실행 : 결과 행 개수 반환
result = cur.execute(sql, data)

 

2_4) 로그인 성공, 실패 여부

result의 결과값이 1개 이상이면 값이 있어 로그인 성공으로 처리됨

# 결과가 1개 이상이면 로그인 성공
if result > 0:
	# 로그인 성공 메시지
    print('로그인 되었습니다')  
else:
	# 실패 메시지
    print('아이디 또는 비밀번호를 확인하세요')

💡 최종코드

db = MySQLdb.connect(host='localhost', user='root', password='1234', db='ai')
cur = db.cursor()

userid = input('아이디를 입력하세요')
userpw = input('비밀번호를 입력하세요')

sql = "select idx from Mytest where userid=%s and userpw=%s"
data = (userid, userpw)
result = cur.execute(sql, data)

if result > 0:
    print('로그인 되었습니다')
else:
    print('아이디 또는 비밀번호를 확인하세요')

cur.close()
db.close()

실행결과 예시▶


3) 💡로그인 프로그램 만들기(최대 5회 시도가능)

위 최종 코드는 로그인을 실패하면 그대로 프로그램이 종료된다.

실제 프로그램이 돌아가는 것 처럼 최대 5번까지 값을 입력받도록 기능을 추가하고

5번 모두 실패할 경우에만 프로그램이 종료되도록 프로그램 업그레이드한다.


3_1) 시도횟수, 로그인 성공 여부 저장할 변수

# 시도 횟수
count = 0  

# 로그인 성공 여부
success = False

 

3_2) while문 조건추가 + 몇회 시도하는지 print 출력

while문에 count 변수를 사용하여 5회까지만 실행되도록 수정하고

반복문을 실행할 때 현재 몇번째 로그인을 시도하고 있는데 print로 출력한다.

while count < 5:
    print(f"\n[{count+1}/5] 로그인 시도")


3_3) 로그인 성공 시 success 값 변경, 로그인 실패 시 count증가

처음 지정하였던 변수들의 값을

로그인을 성공하면 success = True 로 변경하고

로그인을 실패하면 count가 1 증가하도록 설정한다.

# result값이 0보다 크면 로그인 성공
if result > 0:
    print('로그인 되었습니다')
    # 로그인 성공 : 변수 값 변경
    success = True
    break
    
# 로그인 실패
else:
    print('아이디 또는 비밀번호를 확인하세요')
    
# 실패했을 때만 증가
count += 1


3_4) 5번 모두 로그인 실패했을 경우

5번 모두 로그인에 실패하여 success값이 여전히 False인 경우

if not success:
    print("\n5번 모두 실패했습니다. 로그인 불가")

💡 최종코드

import MySQLdb

db = MySQLdb.connect(host='localhost', user='root', password='1234', db='ai')
cur = db.cursor()

success = False 

for i in range(5): 
    print(f"\n[{i+1}/5] 로그인 시도")

    userid = input('아이디를 입력하세요: ')
    userpw = input('비밀번호를 입력하세요: ')

    sql = "select idx from Mytest where userid=%s and userpw=%s"
    data = (userid, userpw)

    result = cur.execute(sql, data)

    if result > 0:
        print('로그인 되었습니다')
        success = True
        break
    else:
        print('아이디 또는 비밀번호를 확인하세요')

if not success:
    print("\n5번 모두 실패했습니다. 로그인 불가")

cur.close()
db.close()

실행결과 예시▶


4) 회원 정보 수정 프로그램 (UPDATE)

  • 기본조건은 회원가입 프로그램과 동일하다.
  • 수정할 회원의 아이디를 입력받은 후 회원 정보를 수정한다.
  • 반복문 사용, 추가로 수정 할 회원이 있는지 물은 후 y를 입력하면 추가수정을 진행한다.

📌 회원가입과 다른 차이점

회원가입(INSERT)는 새로운 행 데이터를 추가하는것이며 PK가 중복되면 실패처리 된다.

하지만 회원수정(UPDATE)는 기존 데이터를 수정하는것이기 때문에 기준 값이 필요하며(userid) PK중복과는 상관이 없다.

※ where가 꼭 필요하다! > 없을 경우 모든 데이터가 수정됨


4_1) SQL문 작성 (where절 사용)

# update를 사용하여 정보를 수정한다.
# 마지막에 where절을 사용해 입력받은 userid의 데이터만 수정하도록 조건을 추가한다.
sql = "update Mytest set name=%s, hp=%s, email=%s, ssn1=%s, ssn2=%s, zipcode=%s, address1=%s, address2=%s, address3=%s, gender=%s 
where userid=%s"

 

4_2) 변경 성공여부 출력

result값이 0 이상이면 변경된 값이 있으므로 변경되었다고 출력한다.

result = cur.execute(sql, data)
db.commit()

if result > 0:
    print('변경되었습니다')
else:
    print('에러!')

💡 최종코드

db = MySQLdb.connect(host='localhost', user='root', password='1234', db='ai')
cur = db.cursor()

while True:
    try:
        userid = input('변경할 아이디를 입력하세요: ')
        name = input('이름을 입력하세요: ')
        hp = input('전화번호를 입력하세요: ')
        email = input('이메일을 입력하세요: ')
        ssn1 = input('주민등록번호 앞자리를 입력하세요: ')
        ssn2 = input('주민등록번호 뒷자리를 입력하세요: ')
        zipcode = input('우편번호를 입력하세요: ')
        address1 = input('주소를 입력하세요: ')
        address2 = input('상세주소를 입력하세요: ')
        address3 = input('참고사항 입력하세요: ')
        gender = input('성별을 입력하세요(남자 또는 여자): ')
        sql = "update Mytest set name=%s, hp=%s, email=%s, ssn1=%s, ssn2=%s, zipcode=%s, address1=%s, address2=%s, address3=%s, gender=%s where userid=%s"
        data = (name, hp, email, ssn1, ssn2, zipcode, address1, address2, address3, gender, userid)
        result = cur.execute(sql, data)
        db.commit()

        if result > 0:
            print('변경되었습니다')
        else:
            print('에러!')
        
        yn = input('추가로 변경하겠습니까? (y/n): ')
        if yn.lower() == 'n':
            print('프로그램을 종료합니다')
            break

    except Exception as e:
        print('다시 입력하세요')

cur.close()
db.close()

실행결과 예시▶

 


5) 회원 탈퇴 프로그램 (DELETE)

  • 탈퇴할 회원의 아이디를 입력받아 일치하는 데이터를 삭제한다.
  • 특정 회원만 삭제하기 위해 회원 정보 수정과 동일하게 where절을 실행한다.
  • 데이터 삭제 후 정상적으로 처리되었음을 출력하고 프로그램 종료

5_1) 탈퇴 할 아이디 입력받기

userid = input('탈퇴할 아이디를 입력하세요: ')

 

5_2) SQL문 실행  (where, 튜플형태)

데이터를 삭제하기 위해 DELETE문을 사용하며,

uesrid라는 값이 한개이지만 튜플 형태로 인식하기 위해 콤마를 붙여 사용한다.

# delete문에 조건붙여 사용
sql = 'delete from Mytest where userid=%s'

# (userid,) : 튜플형태로 반환하기 위해 콤마 추가
result = cur.execute(sql, (userid,))

💡 최종코드

db = MySQLdb.connect(host='localhost', user='root', password='1234', db='ai')
cur = db.cursor()

userid = input('탈퇴할 아이디를 입력하세요: ')
sql = 'delete from Mytest where userid=%s'
result = cur.execute(sql, (userid,))
db.commit()

if result > 0:
    print('탈퇴되었습니다')
else:
    print('오류')

cur.close()
db.close()

6) 💡회원 탈퇴 프로그램(try-except추가, 정말 삭제할지 되묻기)

위 최종 코드는 try-except가 빠져있어 

외래키같이 다른 테이블에 참조외어있는 데이터를 선택하여 삭제할 수 없는 코드이다.

또한 삭제직전에 정말 삭제할지 여부를 묻는 기능을 추가하여 실제 프로그램처럼 작동하도록 수정한다.


6_1) while문으로 변경, try-except 추가

참조되어있는 데이터 삭제시도 시 에러 발생을 막기 위해 try-except를 사용한다.

while True:
    try:
    	...
    except Exception as e:
    	...

 

6_2) except문 rollbak() 추가

에러가 발생할 경우 db.rollback()을 실행하여

작업중이던 데이터베이스 상태를 안전하게 명령 실행 전으로 되돌리고

print로 오류사항을 출력한다.

※ rollback() : 실수로 테이블을 수정하거나 삭제했을 때, COMMIT을 실행하기 전이라면 ROLLBACK으로 데이터를 복구할 수 있다. (Ctrl+Z역할)

db.rollback()
print('오류: 다른 데이터(테이블)와 연결되어 있어 탈퇴가 불가능합니다.')

💡 최종코드

import MySQLdb
db = MySQLdb.connect(host='localhost', user='root', password='1234', db='ai')
cur = db.cursor()

while True:
    try:
        userid = input('탈퇴할 아이디를 입력하세요: ')
    
        sql = 'delete from Mytest where userid=%s'
        result = cur.execute(sql, (userid,))
        db.commit() # 정상 처리 시 최종 반영
        
        if result > 0:
            print('탈퇴되었습니다.')
        else:
            print('해당 아이디가 존재하지 않습니다.')
            
    except Exception as e:
        db.rollback()
        print('오류: 다른 데이터(테이블)와 연결되어 있어 탈퇴가 불가능합니다.')
        
    yn = input('추가로 탈퇴하시겠습니까? (y/n): ')
    if yn.lower() == 'n':
        print('프로그램을 종료합니다')
        break

cur.close()
db.close()

실행결과 예시▶ 1. 참조되어있는 데이터 삭제 시도

 

실행결과 예시▶ 2. 참조되어있지 않은 데이터 삭제 시도