개발공작소
article thumbnail
728x90
반응형

 

 

 

팝업창 만드는데, 처음부터 환경 잡느라 시간을 많이 썼다..

오늘은 아래 내용을 다룰 예정이다.

 

(1) 팝업창 테이블 생성 + 시퀀스 생성

(2) 시퀀스 생성

(3) 팝업 데이터 삽입 View 생성

(4)팝업 내용 INSERT

 

바로 시작해보자.

 

1. 팝업창 테이블 생성

CREATE TABLE DBTEST.sm_popup(
	ntt_id numeric NOT NULL, -- 팝업 번호
	ppup_yn varchar(1) NULL, -- 팝업 사용 여부 기본 : 'Y'
	pop_sub varchar(50), -- 팝업 제목
	pop_con varchar(200), -- 팝업 내용
	beg_de varchar(10) NOT NULL, -- 팝업이 보일 시작일
	end_de varchar(10) NOT NULL, -- 팝업이 안보이게 될 종료일
	CONSTRAINT sm_popup_pkey PRIMARY KEY (ntt_id) -- 기본키는 ntt_id로 설정
);

우선 이렇게 팝업창 테이블을 생성해주었다.

 

 

2. 시퀀스 생성

CREATE SEQUENCE DBTEST.popSeq;

ntt_id의 값을 자동으로 할당해 줄 popSeq라는 시퀀스를 생성해주었다..

 

 

3. 팝업 데이터 삽입 VIEW 생성

 

home.jsp

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
    
    <script src="https://code.jquery.com/jquery-3.2.1.js"></script> 
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.9.0/js/bootstrap-datepicker.min.js" integrity="sha512-T/tUfKSV1bihCnd+MxKD0Hm1uBBroVYBOYSk1knyvQ9VyZJpc/ALb4P0r6ubwVPSGB2GvjeoMAJJImBG12TiaQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.9.0/css/bootstrap-datepicker.min.css" integrity="sha512-mSYUmp1HYZDFaVKK//63EcZq4iFWFjxSL+Z3T/aCt4IO9Cejm03q3NKKYN6pFQzY0SBOr8h+eCIAZHPXcpZaNw==" crossorigin="anonymous" referrerpolicy="no-referrer" />
	<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.9.0/locales/bootstrap-datepicker.ko.min.js" integrity="sha512-L4qpL1ZotXZLLe8Oo0ZyHrj/SweV7CieswUODAAPN/tnqN3PA1P+4qPu5vIryNor6HQ5o22NujIcAZIfyVXwbQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</head>
<body>
    <div style="margin-left: 50px; margin-top: 50px;">
    <div class="row">
	  <div class="col-lg-6" style="width: 200px;">
	    <div class="input-group">
	      <input type="text" id="begDe" class="form-control datePicker" value="시작일 입력"/>
	    </div><!-- /input-group -->
	  </div><!-- /.col-lg-6 -->
	  <div class="col-lg-6" style="width: 200px;">
	    <div class="input-group">
	      <input type="text" id="endDe" class="form-control datePicker" value="종료일 입력"/>
	    </div><!-- /input-group -->
	  </div><!-- /.col-lg-6 -->
	</div><!-- /.row -->
        <div class="mb-3">
          <label for="exampleInputEmail1" class="form-label">팝업제목</label>
          <input type="text" id="popSub" class="form-control" aria-describedby="emailHelp" style="width: 300px;">
        </div>
        <div class="mb-3">
          <label for="exampleInputPassword1" class="form-label">팝업내용</label>
          <input type="text" id="popCon" class="form-control" style="width: 300px;">
        </div>
        <button type="submit" class="btn btn-primary" id="insertPop">확인</button>
    </div>
</body>
</html>

 

script

const button = document.querySelector('#insertPop');
    // 팝업제목/내용 객체 생성
    let popInfo = {
        popSub : '',
        popCon : '',
        ppupYn : 'Y',
        begDe : '',
        endDe : ''
        
    }
    // 클릭 이벤트 생성 : 이벤트 호출시 팝업 제목,내용을 popInfo객체네 넣고 비동기 통신 수행
    button.addEventListener('click', event =>{

        popInfo.popSub = document.querySelector('#popSub').value;
        popInfo.popCon = document.querySelector('#popCon').value
        popInfo.begDe = document.querySelector('#begDe').value
        popInfo.endDe = document.querySelector('#endDe').value

        // 통신을 수행 할 URL생성
        const URL = '/com/insertPopup.do';

        // 비동기 통신 실행
        const insertPop = fetch(URL, {
            method : 'POST',
            headers : {'Content-type' : 'application/json'},
            body : JSON.stringify(popInfo)
        });

    })
    
    
    
    document.addEventListener("DOMContentLoaded", function(){
	$('.datePicker').datepicker({
		format: 'yyyy-mm-dd', //데이터 포맷 형식(yyyy : 년 mm : 월 dd : 일 )
		startDate: '-10d', //달력에서 선택 할 수 있는 가장 빠른 날짜. 이전으로는 선택 불가능 ( d : 일 m : 달 y : 년 w : 주)
		endDate: '+10d', //달력에서 선택 할 수 있는 가장 느린 날짜. 이후로 선택 불가 ( d : 일 m : 달 y : 년 w : 주)
		autoclose: true, //사용자가 날짜를 클릭하면 자동 캘린더가 닫히는 옵션
		calendarWeeks: false, //캘린더 옆에 몇 주차인지 보여주는 옵션 기본값 false 보여주려면 true
		clearBtn: false, //날짜 선택한 값 초기화 해주는 버튼 보여주는 옵션 기본값 false 보여주려면 true
		datesDisabled: ['2019-06-24', '2019-06-26'], //선택 불가능한 일 설정 하는 배열 위에 있는 format 과 형식이 같아야함.
		daysOfWeekDisabled: [0, 6], //선택 불가능한 요일 설정 0 : 일요일 ~ 6 : 토요일
		daysOfWeekHighlighted: [3], //강조 되어야 하는 요일 설정
		disableTouchKeyboard: false, //모바일에서 플러그인 작동 여부 기본값 false 가 작동 true가 작동 안함.
		immediateUpdates: false, //사용자가 보는 화면으로 바로바로 날짜를 변경할지 여부 기본값 :false
		multidate: false, //여러 날짜 선택할 수 있게 하는 옵션 기본값 :false
		multidateSeparator: ',', //여러 날짜를 선택했을 때 사이에 나타나는 글짜 2019-05-01,2019-06-01
		templates: {
		leftArrow: '&laquo;',
		rightArrow: '&raquo;',
		}, //다음달 이전달로 넘어가는 화살표 모양 커스텀 마이징
		showWeekDays: true, // 위에 요일 보여주는 옵션 기본값 : true
		title: '테스트', //캘린더 상단에 보여주는 타이틀
		todayHighlight: true, //오늘 날짜에 하이라이팅 기능 기본값 :false
		toggleActive: true, //이미 선택된 날짜 선택하면 기본값 : false인경우 그대로 유지 true인 경우 날짜 삭제
		weekStart: 0, //달력 시작 요일 선택하는 것 기본값은 0인 일요일
		language: 'ko', //달력의 언어 선택, 그에 맞는 js로 교체해줘야한다.
    })
})

 

결과화면

 

디자인에는 그렇게 힘을 많이 쓰지 않았다. 정말 필요한 내용만 입력 할 수 있을 정도로..

딱히 설명 할 게 없다. 그냥 부트스트랩, 제이쿼리를 cdn으로 가져왔고,

내용 입력후, 확인 버튼을 누르면 입력 내용을 popInfo라는 객체에 담아 fetch함수를 통한 비동기 통신을 실행한다.

그게 끝... 그 외에는 그냥 모르고 써도 된다. 캘린더 관련 내용이라...

 

4. 팝업내용 INSERT

 

평범한 MVC패턴을 통해 입력 한 데이터를 테이블에 INSERT해준다. 간단히 코드만 보자.

 

HomeController.java

@Inject
private HomeService homeService;

/*
* POST방식으로 JSON데이터를 객체(VO)로 받아 Service 호출
*/
@RequestMapping(value="/insertPopup.do" , method = RequestMethod.POST)
public void insertPopup(@RequestBody PopInfoVO pop) throws IOException{
    homeService.insertPopup(pop);
}

HomeService.java

@Inject
private HomeMapper homeMapper;

public void insertPopup(PopInfoVO pop) {
    homeMapper.insertPopup(pop);
}

HomeMapper.java

@Autowired
protected SqlSessionTemplate sqlSession; // db연동 객체

public void insertPopup(PopInfoVO pop) {
    sqlSession.insert("pop.test.insertPopup", pop);
}

PopInfoVO.java

package app.model.com;


public class PopInfoVO {

	private int nttId; 
	private String popSub; 
	private String popCon;
	private String ppupYn;
	private String begDe;
	private String endDe;
	public int getNttId() {
		return nttId;
	}
	public void setNttId(int nttId) {
		this.nttId = nttId;
	}
	public String getPopSub() {
		return popSub;
	}
	public void setPopSub(String popSub) {
		this.popSub = popSub;
	}
	public String getPopCon() {
		return popCon;
	}
	public void setPopCon(String popCon) {
		this.popCon = popCon;
	}
	public String getPpupYn() {
		return ppupYn;
	}
	public void setPpupYn(String ppupYn) {
		this.ppupYn = ppupYn;
	}
	public String getBegDe() {
		return begDe;
	}
	public void setBegDe(String begDe) {
		this.begDe = begDe;
	}
	public String getEndDe() {
		return endDe;
	}
	public void setEndDe(String endDe) {
		this.endDe = endDe;
	}
	
}

 

testMapper.xml

<mapper namespace="pop.test">
    <insert id="insertPopup" parameterType="app.model.com.PopInfoVO">
        insert into DBTEST.sm_popup (NTT_ID, PPUP_YN, POP_SUB, POP_CON, BEG_DE, END_DE) values 
            (POPSEQ.NEXTVAL, #{ppupYn}, #{popSub}, #{popCon}, #{begDe}, #{endDe}) 	
    </insert>
</mapper>

 

이게 끝이다. 이렇게 하고 데이터가 들어가는 것을 확인해보자.

 

입력값
결과값

 

 

솔직히 팝업창 넣는 건 별 거 없기에 중요하지 않다. 중요한 건 팝업창을 화면에 띄우는 건데,

하루동안 보이지 않게 하기 위한 쿠키 설정이나, 팝업이 여러개 있을 때 어떻게 화면에 보여줄 것인가.. 등등

그게 메인인 것 같다. 다음에는 팝업창을 표출 하는 것을 해보도록 하자.

 

 

728x90
반응형
profile

개발공작소

@모찌바라기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!