학습 로그/Project

D+68[Project] UI 화면구현(모달,팝업) & 데이터가져오기 에러 조치는?

goodjob^^ 2026. 7. 14. 20:29

ㅇ 일 자 : 2026년 7월 14일(화) 
ㅇ 주 제 : UI 화면 구현시 모달과 팝업의 차이점 & 데이터 가져오기 에러 조치 하기
 
1. 화면 구현시 모달과 팝업 : 웹 디자인/개발 분야에서 '팝업(Popup)'과 '모달(Modal)'의 핵심적인 차이점

1.1. 팝업 vs 모달 핵심 차이점
차 이 점 팝  업 모  달
창이 열리는 방식 브라우저의 새로운 독립된 창(Window)을
생성하여 띄운다.
현재 보고 있는 웹 페이지(Layer) 위에 어두운
배경과 함께 덧씌운다.  
기존 화면 조작 가능 여부 창이 떠 있어도 뒤의 메인 페이지를 자유롭게
조작할 수 있다.
모달창을 닫기 전까지는 뒤의 메인 페이지를 절대
조작할 수 없다
사용목적 및 용도 단순 공지, 이벤트 광고 등 메인 기능 외 부가
정보 노출에 사용
로그인, 회원가입, 경고, 필수 동의 등 사용자의
특정 행동을 강제해야 할 때 쓰인다
기술적 특징 사용자 브라우저의 팝업 차단 기능에 걸려
안 보일 수 있다
웹 페이지 내부 코드(HTML/CSS)로
구현되므로 차단되지 않는다


※ '모달' 방식으로 구현하는 화면 :  배경창은 흐려지고, 마우스 이동시 창이 두개가 함께 움직인다. 좀더 깔끔하게 실행된다.

모달 방식으로 구현하는 화면 : 배경창은 흐려지고, 마우스 이동시 창이 두개가 함께 움직인다.

 
1. 2. 팝업 (Popup) 구현하기

팝업은 브라우저의 새 창을 여는 방식이므로 CSS 없이 JavaScript의 window.open() 함수만으로 구현한다.
// html
<!-- 메인 페이지 (index.html) -->
<button onclick="openPopup()">팝업창 열기</button>

<script>
function openPopup() {
    // window.open('주소', '창이름', '옵션')
    window.open(
        'popup.html', 
        'samplePopup', 
        'width=400, height=500, top=100, left=100, resizable=no'
    );
}
</script>
//html
<!-- 팝업으로 열릴 페이지 (popup.html) -->
<!DOCTYPE html>
<html>
<head><title>팝업창</title></head>
<body>
    <h3>공지사항 팝업입니다.</h3>
    <p>이 창이 떠 있어도 뒤의 메인 페이지를 조작할 수 있습니다.</p>
    <button onclick="window.close()">창 닫기</button>
</body>
</html>
 
 
1.3. 모달 (Modal) 구현하기
모달은 현재 페이지 위에 레이어를 얹고, 배경을 어둡게(Dimmed) 만들어 뒤쪽 화면 조작을 막아야 하므로 CSS 구조와 JS를 통한 클래스 제어가 핵임이다.
※ JS를 사용해 CSS의 클래스를 조작(추가/삭제)함으로써 동적인 화면을 구현하고, JS에서 스타일 직접 변경 지양하는 이유는    예를 들어 element.style.color = "red" 처럼 JS로 CSS 속성을 직접 변경하면 유지보수가 어려워진다.  

★웹 개발에서 CSS는 웹페이지의 레이아웃과 디자인을 담당하고, JS(자바스크립트)는 사용자와 상호작용하는 동적인 기능을 담당

//html
<!-- 모달을 열기 위한 버튼 -->
<button id="openModalBtn">모달창 열기</button>

<!-- 모달 전체를 감싸는 컨테이너 (어두운 배경 역할) -->
<div id="modalContainer" class="modal-hidden">
    <!-- 실제 모달 콘텐츠 박스 -->
    <div class="modal-content">
        <h3>필수 동의 안내</h3>
        <p>모달창을 닫기 전까지는 뒤의 메인 페이지를 클릭할 수 없습니다.</p>
        <button id="closeModalBtn">확인 및 닫기</button>
    </div>
</div>
//CSS
/* 어두운 배경 처리 및 화면 중앙 정렬 */
#modalContainer {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.6); /* 뒷 배경을 어둡게 */
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 9999; /* 항상 최상단에 위치 */
}

/* 흰색 모달 박스 스타일 */
.modal-content {
    background-color: white;
    padding: 30px;
    border-radius: 8px;
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
    max-width: 400px;
    width: 100%;
    text-align: center;
}

/* 모달을 숨기는 클래스 */
.modal-hidden {
    display: none !important;
}
// JavaScript
const openModalBtn = document.getElementById('openModalBtn');
const closeModalBtn = document.getElementById('closeModalBtn');
const modalContainer = document.getElementById('modalContainer');

// 모달 열기: 숨김 클래스 제거
openModalBtn.addEventListener('click', () => {
    modalContainer.classList.remove('modal-hidden');
});

// 모달 닫기: 숨김 클래스 추가
closeModalBtn.addEventListener('click', () => {
    modalContainer.add('modal-hidden');
});

// (선택 사항) 모달 바깥 어두운 영역을 클릭해도 닫히게 설정
modalContainer.addEventListener('click', (e) => {
    if (e.target === modalContainer) {
        modalContainer.classList.add('modal-hidden');
    }
});

 

2. DB 연동하는 과정에서 데이터 가져오기 실패 원인 확인 및 조치 

데이터 연동시 애러 메세지 : CREAT DATABASE;

 # 1049 에러 주요 원인
- ​데이터베이스 이름 오타: 연결 설정 파일(application.properties, .env, config.js 등)에 적은 DB 이름에 오타가 있는 경우
- ​실제 DB를 생성하지 않음: 새 프로젝트를 시작하면서 코드 설정만 해두고, 정작 MySQL 서버에는 CREATE DATABASE...로 물리적인 공간을 만들어두지 않았을 때 발생
- ​백업 파일(Dump) 복원 시 오류: 데이터베이스를 백업받은 .sql 파일을 새 서버에 가져와 넣으려고(Import) 할 때, 새 서버에 동일한 이름의 빈 DB를 미리 만들어두지 않아서 자주 발생.

2.1. 코드에서 해결 방법 step-by-step

2.1.1. 접속 정보(ID/PW) 재확인
    - 코드나 설정 파일(.env, config.js, settings.py 등)에 적힌 데이터베이스 접속 정보를 다시 확인
    - Username: 'user'가 맞는지 확인 (보통 기본 관리자는 root)
    - Password: 비밀번호에 오타가 없는지, 공백이 들어가지 않았는지 확인
 
2.1.2. 권한(Grant) 및 호스트(Host) 확인
- MySQL은 사용자명 뿐만 아니라 접속하는 위치(Host)도 정확히 일치해야 한다.
- 에러 메시지의 'user'@'localhost'는 localhost(현재 컴퓨터)에서 user라는 이름으로 접속을 시도했다
- 데이터베이스 관리자 계정(root 등)으로 접속하여 해당 사용자가 등록되어 있고 권한이 있는지 확인
- 사용자 목록 및 접속 호스트 확인 :  user와 localhost가 쌍으로 존재해야 하고, 만약 외부에서 접속하는 것이라면 localhost 대신 %(모든 호스트) 또는 특정 IP가 지정되어 있어야 한다.

# SQL 
SELECT User, Host FROM mysql.user;

 
- 사용자 생성 및 권한 부여 (필요한 경우) : 만약 계정이 없거나 권한이 없다면, 관리자 계정으로 접속하여 아래 명령어로 계정을 생성하고 권한을 부여하기

// SQL
-- 계정 생성 (비밀번호 설정)
CREATE USER 'user'@'localhost' IDENTIFIED BY '실제비밀번호';

-- 특정 데이터베이스(예: mydb)에 대한 모든 권한 부여
GRANT ALL PRIVILEGES ON mydb.* TO 'user'@'localhost';

-- 설정 반영
FLUSH PRIVILEGES;

 
3. 비밀번호 인증 방식 문제 (MySQL 8.0 이상)
- MySQL 8.0 이상부터는 기본 비밀번호 암호화 방식(caching_sha2_password)이 변경되어, 기존 라이브러리나 툴에서 접속하지 못하는 경우가 있다. 이 경우 기존 방식 (mysql_native_password)으로 변경해 주면 해결된다.

// SQL
ALTER USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY '실제비밀번호';
FLUSH PRIVILEGES;

 


※ 코드의 데이터베이스 설정 부분에서 ID가 user가 맞는지, 비밀번호가 정확한지 먼저 확인후, 그래도 안 된다면 MySQL 서버에 root 계정으로 들어가 user 계정의 생성 여부와 권한을 확인하자. 
웹페이지 구현은 실제로 해보면 결코 쉽지 않은 작업이다. 인공지능이 아무리 자동으로 쉽게 해준다고는 하지만 그 문법을 알지 못하면 도무지 이해할 수가 없다. 개발후 유지보수가 관건이다.  "도전은 계속된다."