콜라츠 추측 문제 및 나의 풀이

안녕하세요

오늘도 잠깐 알고리즘 풀이법을 올려봅니다.

이건 레벨2치고 쉬어서 금방 풀어 기분 좋게 올립니다.


일단 문제가 다음과 같습니다.

'1937년 Collatz란 사람에 의해 제기된 이 추측은, 입력된 수가 짝수라면 2로 나누고, 홀수라면 3을 곱하고 1을 더한 다음, 결과로 나온 수에 같은 작업을 1이 될 때까지 반복할 경우 모든 수가 1이 된다는 추측입니다. 예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다. collatz 함수를 만들어 입력된 수가 몇 번 만에 1이 되는지 반환해 주세요. 단, 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.'

문제가 조금 설명충이고 길어서 복잡해보이지만 정말 단순합니다.

if문과 반복문만 적절히 사용하면 초보자도 쉽게 풀수 있는 문제입니다.

일단 제 답안입니다.


class Collatz {
public int collatz(int num) {
int answer = 0;
int cnt=0;
while(cnt < 500){
cnt++;
if(num%2==0){
num = num/2;
}else if(num%2==1){
num = (num*3)+1;
}
if(num==1){
answer = cnt;
return answer;
}
}

answer = -1;
return answer;
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
public static void main(String[] args) {
Collatz c = new Collatz();
int ex = 6;
System.out.println(c.collatz(ex));
}

}


언젠가 알고리즘도 많이 풀고 궁리하다보면
높은 레벨의 문제도 쉽게 풀거라 믿습니다.
모두 힘냅시다!!



자바 평균구하기 문제

안녕하세요

이번 시간에는 {*}helloworld에서 올라온 문제를 하나 풀이하는 시간을 가지겠습니다.

일단 저도 개발을 썩 잘하는것이 아니라서

제가 올린게 최고의 정답이라고 생각하지 않습니다


일단 질문이 아래와 같습니다

'def average(list):
함수를 완성해서 매개변수 list의 평균값을 return하도록 만들어 보세요.
어떠한 크기의 list가 와도 평균값을 구할 수 있어야 합니다'


이에 대한 저의 풀이는 아래와 같습니다.

=================

public class GetMean {
    public int getMean(int[] array) {
    int result = 0;
    for(int i=0; i<array.length; i++){
    result+=array[i];
    }
        return (result) / array.length;
    }
   
    public static void main(String[] args) {
        int x[] = {5, 4, 3};
        GetMean getMean = new GetMean();
        // 아래는 테스트로 출력해 보기 위한 코드입니다.
        System.out.println("평균값 : " + getMean.getMean(x));
    }
}
=================

문제를 풀고 나서 정답이 되고 다른 사람들의 문제 풀이를 봤는데

그중에서 댓글이 가장 많고 참신했던 것이 있었습니다.

저는 여러줄로 처리한걸 이 사람은 한줄로 처리했네요;;




라이브러리를 사용해서 해결한건데, 신박하네요 참 ㄷㄷ

어쨋든 문제가 주어지면 어떤 방법을 써서 해결하는것도 중요하죠.





CentOS 유선 랜 설정 하기

안녕하세요

이번 시간에는 CentOS 유선 랜 설정하는 방법에 대해 리뷰하겠습니다.

앞서 CentOS 설치를 끝나고 ID는 'root'로 비밀번호는 개인이 정한걸로 입력해서

접속하면 먼저 해야할게 인터넷이 되게끔 설정 해주는게 먼저입니다.

인터넷이 되야지 요즘은 뭘 할수 있는 시대이죠 ㅜ













일단 커맨드 창에 'ifconfig-a'를 검색하면 네트워크 디바이스 장치들이 검색됩니다

eth0은 이더넷이고, lo는 자기 자신에게 송수신하는 테스트 디바이스,

그리고 목록에는 없지만 wlan과 같은 무선 디바이스도 있습니다.


일단 사내에서는 리눅스 서버로 돌리는 노트북에 유선랜을 꽂고 나서
'vi /etc/sysconfig/network-scripts/ifcfg-eth0'를 입력하면
네트워크 디바이스를 설정하는 파일이 나옵니다.

거기에서 아래와 같이 수정합니다
=====================================
DEVICE=eth0
TYPE=Ethernet
IPADDR=211.xxx.xxx.xxx
NETMASK=255.xxx.xxx.xxx
GATEWAY=211.xxx.xxx.xxx
DNS1=164.xxx.xxx.xxx
DNS2=168.xxx.xxx.xxx
UUID=13b809d9-67c3-4ac2-8789-xxx.xxx.xxx
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
HWADDR=6C:62:xx:xx:xx:xx
DEFROUTE=yes
PEERDNS=no
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
====================================

제가 xxx 로 표시한것은 저대로 입력하라는게 아니고 원래 부여된 고유의 값이나
자신의 네트워크 설정 환경에 맞춰서 입력하라는 것입니다.

위에서 네트워크 디바이스 설정을 했으면, 이후에 네트워크 설정을 해야겠죠?
커맨드 창에 vi /etc/sysconfig/network 를 입력하시고 아래와 같이 바꿉니다

==========================================
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=xxxxxx
GATEWAYDEV=eth0
==========================================

HOSTNAME 역시 자신의 환경에 맞는 이름을 입력하세요.


지금까지 네트워크 디바이스 및 네트워크 설정을 했습니다.
자 그럼 이제 네트워크가 되는지 확인을 해야겠죠?

'ifconfig eth0 up' 명령어로 이더넷 장치를 구동 시키고
'service network start' 명령어로 네트워크를 시작합니다.

그리고 서버 아이피나 근처 다른 아이피를 쓰는 디바이스에게
'ping 211.xxx.xxx.xxx'을 날립니다.

커맨드 창에 아래와 같이 나온다면 성공입니다
5 packets transmitted, 5 received, 0% packet loss, time 4369ms
rtt min/avg/max/mdev = 0.028/0.063/0.073/0.017 ms

방금전에 ping을 날린건 내부 통신을 확인한거고
이번에는 naver.com과 같은 외부 통신을 확인해봅시다

'nslookup naver.com'을 입력하시고 아래와 같이 나오면 성공합니다
Non-authoritative answer:
Name: naver.com
Address: 125.209.222.142
Name: naver.com
Address: 125.209.222.141
Name: naver.com
Address: 202.179.177.21
Name: naver.com
Address: 202.179.177.22

잠깐 빼먹은 이야기가 있는데, 'nslookup naver.com' 입력했을 때
-bash: ns: command not found
위와 같은 커맨드가 나올 수 있습니다.
이건 nslookup 명령어를 수행할 패키지가 없는것인데
이때는 'yum install bind-utils' 를 입력하여 패키지를 설치하면 됩니다 ㅎ


CentOS 설치 방법 정리 - USB로 CentOS 운영체제를 설치해보자

안녕하세요

정말 오랜만에 글을 써보네요.

회사 일이 바쁘다보니 블로그 글을 많이 못썼네요.

오늘 포스팅은 얼마전 제가 회사에서 CentOS 운영체제로 리눅스 서버를 돌려 홈페이지를 나오게 하는 작업이 있어 그걸 한번 써볼까 합니다.

일단 이번 포스팅에서는 CentOS 설치 방법을 리뷰하겠습니다.


1.  CentOS ISO 파일을 다운받기

먼저 운영체제를 설치하기 위해서 iso 파일을 받을 필요가 있습니다.
















URL : http://vault.centos.org/6.6/isos/x86_64/
위의 주소에 들어가 CentOS-6.6-x86_64-minimal.iso 파일을 다운 받습니다.
minimal이 아닌 풀버전도 있지만 가볍게 쓰고 싶어서 회사에서도 minimal로
리눅스 서버를 돌리더군요.



2. UltlaISO 프로그램으로 CentOS ISO 파일을 굽기

이제 ISO 파일을 받았으면 흔히들 말하는 ISO 파일을 구워야 합니다.
ISO 파일을 구워주는 프로그램들이 많긴 하지만 저는 'UltlaISO'를 이용했습니다.

















url : https://ultraiso.ko.softonic.com/

위의 경로로 들어가면 해당 프로그램을 바로 다운받을 수 있습니다.

설치가 끝나고 프로그램을 실행하면

부팅 - 디스크이미지기록 으로 들어가면





















디스크 드라이브에 제가 F 드라이브에 있는 USB를 지정하고
쓰기를 누르면 CentOS ISO 파일을 구워줍니다.


3. BIOS(바이오스) 부팅 순서 설정

사실 이제 3번만 하면 다 한거나 다름없습니다.

2번까지 다 하셨다면 이제 컴퓨터를 재부팅 해줍니다.

재부팅 하고 'F2', 'DEL' 키를 누르면 BIOS 설정 화면이 나옵니다


















BIOS 화면에서 'Boot' 탭으로 들어가 디바이스 우선 순위를 하드디스크가 아닌
USB로 바꾸고 설정을 저장하고 재시작합니다.















이제 CentOS 설치 화면이 나오고 첫번째 줄을 선택하면
설치가 진행됩니다.

사실 이 이후부터는 일반 윈도우 운영체제 설치하는 것처럼
어렵지 않기 때문에 여기까지 글을 써보겠습니다.

다음 포스팅에서는 CentOS 운영체제에서 War 파일을 배포하여
홈페이지를 띄우는 법에 대해 리뷰하겠습니다.


홈페이지 만들기 프로젝트 part2 - 회원가입을 구현해보자

안녕하세요

이번 시간에는 홈페이지 만들기에서 정말 필수적인 부분이죠

회원가입과 로그인 예제를 올려봅니다.


저번 포스팅에 올린 top.jsp에 보면,

참조하는 부분이 세개입니다.


첫번째가 css 파일입니다.

소스코드는 아래와 같이 있습니다.

<link rel="stylesheet" type="text/css" href="<%=myctx%>/css/layout.css">
<link rel="stylesheet" type="text/css" href="<%=myctx%>/css/calendar.css">

즉 css 폴더 아래에 layout.css, calendar.css가 있어야 색상이나 크기 같은 것을

지정 할 수 있습니다.


두 번째 파일은 자바스크립트 파일로..

<script src="./js/calendar.js"></script> 파일로

js 폴더 아래에 calendar 자바스크립트 파일이 있어야 하며

이 파일은 달력을 만드는 파일입니다.

이것은 직접 구현하시길 바라며 따로 공개는 안하겠습니다.

(전에도 블로그에 올렸기 때문에)


그리고 세번째 파일은 jsp 파일로 4개로 구성되어 있습니다.

<li><a href="<%=myctx%>/index.jsp">HOME</a></li>
<li><a href="<%=myctx%>/member/memberJoin.jsp">JOIN</a></li>
<li><a href="<%=myctx%>/login/login.jsp">LOGIN</a></li>
<li><a href="<%=myctx%>/board/board.jsp">BOARD</a></li>

첫번째 index.jsp는 저번 시간에 올렸고,

이번 시간에는 memberJoin.jsp와 login.jsp 두 개를 구현하겠습니다
(board.jsp는 시간이 되면 추후에 올리도록 하겠습니다 - 아직 미구현 ㅜ)


원래는 회원가입과 로그인 두 개 모두 다 올리려고 했는데

회원가입만 해도 관련된 클래스, jsp 파일이 많아 일단 이번 시간에는

memberJoin.jsp 부분만 올리겠습니다.

중요한 소스 부분은 빨간줄로 표시를 하겠습니다.

========================================================

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<jsp:include page="/top.jsp"/>

<style>
td,th{
padding:5px;
}
input{
height:20px;
}
</style>

<script type="text/javascript">

/*아이디 중복체크 팝업 띄우기*/
var idCheck=function(){
var url="idCheck.jsp";
win=window.open(url,"idCheck","width=400, height=400, left=100, top=100");
}

/*입력 값 유효성 체크*/
  var check=function(){
//이름, 아이디, 비번, 연락처1,2,3

if(!f.name.value){
alert('이름을 입력하세요');
f.name.focus();
return;
}

if(!f.userid.value){
alert('아이디를 입력하세요');
f.userid.focus();
return;
}

if(!f.pwd.value){
alert('비밀번호를 입력하세요');
f.pwd.focus();
return;
}

if(f.pwd.value != f.pwd2.value){
alert('비밀번호와 비밀번호 확인이 달라요');
f.pwd2.select();
return;
}

if(!f.hp1.value || !f.hp2.value || !f.hp3.value){
alert('연락처를 모두 입력하세요');
f.hp2.focus();
return;
}

// 연락처, 우편번호 숫자 여부.. <- 내가 해야 할 몫..

// 이용약관 동의 체크 여부
if(!f.agree.checked){
alert('이용약관에 동의해야 해요');
f.agree.focus();
return;
}

f.submit();
}

</script>

<!-- 다음 api를 활용하여 우변펀호 등록하는 스크립트 사용  -->
<script src="http://dmaps.daum.net/map_js_init/postcode.js"></script>
    <script>
        function openDaumPostcode() {
            new daum.Postcode({
                oncomplete: function(data) {
                    // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분. 우편번호와 주소 정보를 해당 필드에 넣고, 커서를 상세주소 필드로 이동한다.
                    document.getElementById("addr1").value = data.postcode1;
                    document.getElementById("addr2").value = data.postcode2;
                    document.getElementById("addr1").value = data.address;
                    document.getElementById("addr2").focus();
                }
            }).open();
        }
    </script>

<div align="center">
    <h1>:::Member Join:::</h1>
    <form name="f" id="f" action="memberJoinEnd.jsp" method="post">
    <table style="width:90%">
    <tr>
    <th width="20%">이름</th>
    <td width="80%" style="text-align: left;">
    <input type="text" name="name">
    </td>
    </tr>
    <tr>
    <th width="20%">아이디</th>
    <td width="80%" style="text-align: left;">
    <input type="text" name="userid" readonly style="background-color:#efefef;">
    <button type="button" onclick="idCheck()">아이디 중복체크</button>
    </td>
    </tr>
    <tr>
    <th width="20%">비밀번호</th>
    <td width="80%" style="text-align: left;">
    <input type="password" name="pwd">
    </td>
    </tr>
    <tr>
    <th width="20%">비밀번호 확인</th>
    <td width="80%" style="text-align: left;">
    <input type="password" name="pwd2">
    </td>
    </tr>
    <tr>
    <th width="20%">이메일</th>
    <td width="80%" style="text-align: left;">
    <input type="text" name="email" style="width:50%">
    </td>
    </tr>
    <tr>
    <th width="20%">연락처</th>
    <td width="80%" style="text-align: left;">
    <select name="hp1">
    <optgroup label="연락처">
    <option value="010">010</option>
    <option value="011">011</option>
    <option value="019">019</option>
    </optgroup>
    </select>
    <input type="text" name="hp2" size="4" maxlength="4">-
    <input type="text" name="hp3" size="4" maxlength="4">
    </td>
    </tr>
    <tr>
    <th width="20%">우편번호</th>
    <td width="80%" style="text-align: left;">
    <input type="text" name="post" maxlength="5" size="15">
    <button type="button" class="btngray btn" onclick="openDaumPostcode()">우편번호 찾기</button>
    </td>
    </tr>
    <tr>
    <th width="20%">주소</th>
    <td width="80%" style="text-align: left;">
    <input type="text" name="addr1" id="addr1" style="width:70%"><br>
    <input type="text" name="addr2" id="addr2" style="width:70%">
    </td>
    </tr>
    <tr>
    <td colspan="2" style="text-align:right; padding-right:30px">이용 약관에 동의하십니까?
    <input type="checkbox" name="agree"></td>
    </tr>
    <tr>
    <td colspan="2">
    <iframe src="agree.html" style="width:90%; heigth:120px"></iframe>
    </td>
    </tr>
    <tr>
    <td colspan="2">
    <button type="button" onclick="check()">회원가입</button>
    <button types="reset">다시쓰기</button>
    </td>
    </tr>
    </table>
    </form>
</div>

<jsp:include page="/foot.jsp"/>



일단 보면 아시겠지만 제가 밑줄로 그은 빨간색 .jsp 파일이 있습니다.

idCheck.jsp, memberJoinEnd.jsp

이 두개를 또 추가적으로 구현해야 합니다.

참고로 idCheck.jsp에서는



user.member 패키지에 MemberDAO.java가 있어야 소스코드가 오류없이 작동합니다.

MemberDAO.java는 db에 쿼리문을 수행하는 소스 코드입니다.

앞으로 많이 나올 예정입니다 ㅜ


========================================================

idCheck.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<link rel="stylesheet" type="text/css" href="../css/layout.css">
<script type="text/javascript">
function setUid(uid){
//uid 값을 팝업창을 띄워준 부모창의 userid 텍스트박스에 넣어주자.
//window(최상위 객체)-->document-->form(최하위)
//부모창=> opener (window 객체)
opener.document.f.userid.value=uid;
//팝업창 닫기
self.close();
//자기창=> self로 참조

}

function checkId(){
if(!frm.userid.value){
alert('아이디를 입력하세요');
frm.userid.focus();
return;
}
frm.submit();
}

</script>

    <%
    String method=request.getMethod();
    //out.println("<b>method="+method);
    //[1] 메소드 방식이 GET 방식이면 => 아이디 입력 폼을 보여준다
    if(method.equalsIgnoreCase("get")){ // 대소문자 상관안하고 get 문자이면..
    %>
    <div align="center" style="padding:10px;">
    <form name="frm" action="idCheck.jsp" method="POST">
    <label for="userid">아이디</label>
    <input type="text" name="userid" id="userid" style="border:1px solid silver">
    <button type="button" onclick="checkId()">확인</button>
    </form>
    </div>
    <%
    }else{
    //[2] POST 방식이면 => 아이디 중복 체크 결과를 보여준다
    // (1) 사용자가 입력한 아이디 값 받아오기
    String userid=request.getParameter("userid");
    if(userid==null||userid.trim().isEmpty()){
    %>
    <script type="text/javascript">
    alert('아이디를 입력해야 해요');
    history.back();
    </script>
    <%
    return;
    }
    %>

<!-- DAO는 웹브라우저 한번 당 세션으로 이어짐 / VO,DTO는 스코프를 페이지로 준다 -->
<jsp:useBean id="userDAO" class="user.member.MemberDAO" scope="session" />
    <%
    // (2) DB member 테이블에 해당 아이디가 있는지 체크
    boolean isUse=userDAO.idCheck(userid.trim());
    if(isUse){ // 사용 가능한 경우 = true
    %>
    <div align="center">
    <p>
    ID로 [<SPAN style="color:red"><b><%=userid%></b></SPAN>]를 사용할 수 있습니다.
    </p>
    <button type="button" onclick="setUid('<%=userid%>')">닫기</button>
    </div>
    <%
    }else{ // 사용 불가능한 경우 = false
    %>
    <div align="center">
    <p>
    ID로 [<SPAN style="color:red"><b><%=userid%></b></SPAN>]는 이미 사용중입니다.
    </p>
   
<form name="frm" action="idCheck.jsp" method="POST">
    <label for="userid">아이디</label>
    <input type="text" name="userid" id="userid" style="border:1px solid silver">
    <button type="button" onclick="checkId()">확인</button>
    </form>
   
    </div>
    <%
    }
    }
    %>


idCheck.jsp에서는 가장 중요한 부분은 역시

userDAO.idCheck(userid.trim());

부분입니다.

즉 user.member 패키지 아래에 있는 MemberDAO 소스에

idCheck() 메소드가 있어야 이 소스는 이상없이 작동됩니다.


그럼 바로 MemberDAO 소스 코드를 공개하겠습니다.

전체 골격 소스는 이번 한번만 공개하고, 다음에 쓰일 때는

메소드만 올리겠습니다.


package user.member;

import db.util.*;
import java.sql.*;
import java.util.*;

// DAO : Data Access Object
public class MemberDAO {

private Connection con;
private PreparedStatement ps;
private ResultSet rs;

public MemberDAO(){
System.out.println("MemberDAO() 생성자");
}

/** 아이디의 사용 가능 여부를 체크하는 메소드*/

public boolean idCheck(String userid) throws SQLException{
try{
con=DBUtil.getCon();
String sql="SELECT idx FROM member WHERE userid=?";
ps=con.prepareStatement(sql);
ps.setString(1, userid);
rs=ps.executeQuery();
//rs의 커서 이동
boolean isRs=rs.next();
return !isRs; // 밑에 4줄 짜리를 한줄로 줄임
/*if(isRs){
//해당 아이디가 member에 있는 경우
return false;
}else{
//없는 경우
return true;
}*/

}finally{
DBUtil.close(rs, ps, con);
}
}


참고로 여기서 db.util 패키지에 DBUtil 이라는 클래스가 또 있어야 합니다 ㅜ

package db.util;

import java.sql.*;
/*드라이버 로딩하고 커넥션을 하는 클래스*/

public class DBUtil {

private static String host="localhost";
private static String url="jdbc:oracle:thin:@"+host+":1521:ORCL";
private static String user="king", pwd="tiger";
private static String driver="oracle.jdbc.driver.OracleDriver";

static{
try{
Class.forName(driver);
System.out.println("Driver Loading Success...");
}catch(Exception e){
e.printStackTrace();
}

}//static initializer - 메모리에 가장 먼저 올라가는 블록으로 main() 보다도 먼저 실행됨

public static synchronized Connection getCon() throws SQLException{
System.out.println("url="+url);
Connection con = DriverManager.getConnection(url,user,pwd);
return con;
}

//setter, getter--

public static String getHost() {
return host;
}

public static void setHost(String host) {
DBUtil.host = host;
}

public static String getUrl() {
return url;
}

public static void setUrl(String url) {
DBUtil.url = url;
}

public static String getUser() {
return user;
}

public static void setUser(String user) {
DBUtil.user = user;
}

public static String getPwd() {
return pwd;
}

public static void setPwd(String pwd) {
DBUtil.pwd = pwd;
}

public static String getDriver() {
return driver;
}

public static void setDriver(String driver) {
DBUtil.driver = driver;
}

public static void close(ResultSet rs, Statement st, Connection con) {
try{
if(rs!=null) rs.close();
if(st!=null) st.close();
if(con!=null) con.close();
System.out.println("DB연결 종료");
}catch(SQLException e){
e.printStackTrace();
}

}
}

========================================================

자 이제 마지막 부분입니다.

memberJoinEnd.jsp 소스 부분인데요.

바로 공개하도록 하겠습니다.


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="../example/error.jsp" %>

    <!-- memberJoinEnd.jsp : 회원가입 처리 페이지
      사용자가 입력한 값을 받아 DB member 테이블에 insert 처리한다.
    -->
   
    <%
    //1. post 방식일 경우 한글 처리
    request.setCharacterEncoding("UTF-8");
   
    //2. 사용자가 입력한 값을 받아온다
    //String name=request.getParameter("name");
    //String userid=request.getParameter("userid");
    //String pwd=request.getParameter("pwd");
    //String email=request.getParameter("email");
    //out.println(name+"/"+userid);
    //out.println("패스워드 : "+pwd);
   
    %>
   
    <jsp:useBean id="userVO" class="user.member.MemberVO" scope="page"/>
    <%--
    MemberVO userVO=new MemberVO()와 동일 -> 다만 MemberVO 클래스에 기본 생성자가 없으면 오류남
    --%>
   
    <jsp:setProperty name="userVO" property="*"/>
    <%--
    userVO.setName(request.getParameter("name"));와 동일
    즉 memberJoin.jsp에서 입력한 값을 각각 얻어오는 것이다.
    userVO.setUserid(...)
    ...
    와 동일
    --%>


    <B><%=userVO%></B>
   
    <%
    //3. 유효성 체크 (이름, 아이디)
    if(userVO.getName()==null||userVO.getUserid()==null){
response.sendRedirect("memberJoin.jsp"); // 이 코드를 작성하면 memberJoinEnd 클래스에서 실행해도 memberJoin으로 되돌아감
    return;
    }
    %>
   
    <jsp:useBean id="userDAO" class="user.member.MemberDAO" scope="session"/>
   
    <%
    int n=userDAO.insertMember(userVO);
    String msg=(n>0)?"회원가입 성공":"회원가입 실패";
    String loc=(n>0)?"memberList.jsp":"javascript:history.back()";
    %>
   
    <script type="text/javascript">
    alert('<%=msg%>');
    location.href='<%=loc%>';
    </script>
   


하아.. 여기서도 참고하고 있는 부분이 세 부분입니다.

첫번째가 에러 화면을 보여주는 error.jsp

두번째가 사용자가 입력한 회원정보 값을 불러들이는 MemberVO 클래스

세번째는 아까 위에서 활용했던 DB를 처리하는 MemberDAO 클래스의 insertMember 메소드


이 세 부분도 바로 소스 코드를 올리겠습니다.

1. error.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<jsp:include page="/top.jsp"/>

<%@ page isErrorPage="true" %>
<%
response.setStatus(response.SC_OK);
//ie에서는 위 코드를 지정해야 에러 처리 페이지가 동작한다
%>

<%-- error.jsp 페이지에서는 page 지시어에 반드시 isErrorPage 라는 속성값으로 true를 주어야 한다.
그래야 exception 이라는 내장 객체를 사용할 수 있다. --%>

<!DOCTYPE html>
<html>
<head><title>error 처리 페이지</title></head>
<body>
<div align="center">
<table style="width:600px;height:400px;background-color:#efefef">
<tr>
<td style="color:red;text-align:center">
<%
if(exception instanceof java.sql.SQLException){
out.println("서버오류: "+exception.getMessage());
}else{
out.println("오류발생: "+exception.getMessage());
}
exception.printStackTrace(); // 스택 기록 찍기(서버 콘솔에)
%>
</td>
</tr>
<tr>
<td>[<a href="javascript:history.back()">이전 페이지</a>]</td>
</tr>
</table>
</div>
<jsp:include page="/foot.jsp"/>



2. MemberVO

package user.member;

import java.io.*;
import java.sql.Date;

//dto, dao 직렬화 하는 것이 좋다
public class MemberVO implements Serializable {
// 멤버변수(인스턴스 변수) => jsp에서는 프로퍼티(property) 라고 부른다.
// 프로퍼티들은 가능하면 html form의 input name과 일치시켜 주는 것이 좋다

private Integer idx; // 회원번호
private String name;
private String userid;
private String pwd;
private String email;
private String hp1, hp2, hp3;
private String post;
private String addr1, addr2;
private java.sql.Date indate;
private int mileage;
private int mstate; // 회원 상태 정보

public MemberVO(){
System.out.println("MemberVO() 생성자");
//기본 생성자 반드시 필요
//기본 생성자가 없으면 jsp에서 useBean으로 객체 생성을 할 수 없다.
}

// 생성자 오버로드

public MemberVO(Integer idx, String name, String userid, String pwd, String email, String hp1, String hp2,
String hp3, String post, String addr1, String addr2, Date indate, int mileage, int mstate) {
super();
this.idx = idx;
this.name = name;
this.userid = userid;
this.pwd = pwd;
this.email = email;
this.hp1 = hp1;
this.hp2 = hp2;
this.hp3 = hp3;
this.post = post;
this.addr1 = addr1;
this.addr2 = addr2;
this.indate = indate;
this.mileage = mileage;
this.mstate = mstate;
}

//setter, getter

public Integer getIdx() {
return idx;
}

public void setIdx(Integer idx) {
this.idx = idx;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getUserid() {
return userid;
}

public void setUserid(String userid) {
this.userid = userid;
}

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getHp1() {
return hp1;
}

public void setHp1(String hp1) {
this.hp1 = hp1;
}

public String getHp2() {
return hp2;
}

public void setHp2(String hp2) {
this.hp2 = hp2;
}

public String getHp3() {
return hp3;
}

public void setHp3(String hp3) {
this.hp3 = hp3;
}

public String getPost() {
return post;
}

public void setPost(String post) {
this.post = post;
}

public String getAddr1() {
return addr1;
}

public void setAddr1(String addr1) {
this.addr1 = addr1;
}

public String getAddr2() {
return addr2;
}

public void setAddr2(String addr2) {
this.addr2 = addr2;
}

public java.sql.Date getIndate() {
return indate;
}

public void setIndate(java.sql.Date indate) {
this.indate = indate;
}

public int getMileage() {
return mileage;
}

public void setMileage(int mileage) {
this.mileage = mileage;
}

public int getMstate() {
return mstate;
}

public void setMstate(int mstate) {
this.mstate = mstate;
}

// 연락처를 하나로 합침
public String getAllHp(){
return hp1+"-"+hp2+"-"+hp3;
}

// 주소도 하나로 합침
public String getAllAddr(){
return addr1+" "+addr2;
}


//toString() 오버라이드

@Override
public String toString() {
return "MemberVO [idx=" + idx + ", name=" + name + ", userid=" + userid + ", pwd=" + pwd + ", email=" + email
+ ", hp1=" + hp1 + ", hp2=" + hp2 + ", hp3=" + hp3 + ", post=" + post + ", addr1=" + addr1 + ", addr2="
+ addr2 + ", indate=" + indate + ", mileage=" + mileage + ", mstate=" + mstate + "]";
}

}


3. MemberDAO 클래스의 insertMember 메소드

public int insertMember(MemberVO user) throws SQLException{
try {
con=DBUtil.getCon();
String sql="INSERT INTO MEMBER(idx,name,userid,email,pwd,hp1,hp2,hp3,post,addr1,addr2,indate,mileage,mstate)"
+ " values (member_idx_seq.nextval,?,?,?,?,?,?,?,?,?,?,sysdate,?,?)";
ps=con.prepareStatement(sql);

// ? 값 셋팅
ps.setString(1, user.getName());
ps.setString(2, user.getUserid());
ps.setString(3, user.getEmail());
ps.setString(4, user.getPwd());
ps.setString(5, user.getHp1());
ps.setString(6, user.getHp2());
ps.setString(7, user.getHp3());
ps.setString(8, user.getPost());
ps.setString(9, user.getAddr1());
ps.setString(10, user.getAddr2());
ps.setInt(11, user.getMileage());
ps.setInt(12, user.getMstate());

// 실행 excuteXXX()
int n = ps.executeUpdate();
return n;
} finally {
DBUtil.close(rs, ps, con);
}
}


========================================================




자 그럼 직접 한번 회원가입을 해보겠습니다.









홈페이지 만들기 프로젝트 part1 - 기본 골격 만들기

안녕하세요

이번 시간에는 jsp와 java, html ,javascript를 활용하여 홈페이지를 만드는 시간을

가져보겠습니다.

한번에 전체 소스를 올리는 것은 당사자인 저도 정리가 안될뿐더러

파트 별로 나눠서 올리는 것이 이해가 될 것 같아

부분 부분 모듈 별로 올려봅니다.


이번 시간에는 홈페이지 메인 화면의 구조에 관한 소스 코드와

설명을 올리겠습니다.


결과 화면은 아래와 같습니다. UI는 솔직히 아직 다듬은 상태가 아니라 별로입니다




막상 봤을 때는 단순해 보이지만

총 세개의 파일로 구성되어 있습니다.

1. 화면의 상단을 보여주는 top.jsp

2. 화면의 하단을 보여주는 foot.jsp

3. 화면의 중간을 보여주는 index.jsp


자 그럼 먼저 top.jsp 부터 소스 코드를 공개하겠습니다


=========================================================

//top.jsp - 화면 상단

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- top.jsp : top 페이지는 모든 페이지에서 include 하므로 절대경로로 링크 거는 것이 좋다.-->
<%
//컨텍스트명을 얻어온다.
String myctx=request.getContextPath();
//=> "MyWeb"
%>

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>::HomePage::</title>
  <link rel="stylesheet" type="text/css" href="<%=myctx%>/css/layout.css">
  <link rel="stylesheet" type="text/css" href="<%=myctx%>/css/calendar.css">

  <script src="./js/calendar.js"></script>

 </head>
 <body onload="showToday()">
 <div id="wrap">
<!-- 헤더영역--------------------------- -->
<header>
<!--헤더: 문서의 로고 이미지,검색폼,목차
등이 들어감-->
<a href="http://www.facebook.com"><img src="<%=myctx%>/images/logo2.PNG"></a>
</header>
<div class="clear"></div>
<!-- nav:네비게이션바-------------- -->
<nav>
<ul>
<li><a href="<%=myctx%>/index.jsp">HOME</a></li>
<li><a href="<%=myctx%>/member/memberJoin.jsp">JOIN</a></li>
<li><a href="<%=myctx%>/login/login.jsp">LOGIN</a></li>
<li><a href="<%=myctx%>/board/board.jsp">BOARD</a></li>
</ul>
</nav>
</div>

<div class="clear"></div>
<!--article:주로 컨텐츠가 들어감  -->
<article>


=========================================================

//foot.jsp - 화면 하단


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- foot.jsp -->
</article>
<!-- aside: 사이드 메뉴가 들어감 -->
<% String myctx=request.getContextPath(); %>
<aside>
<nav>
<!-- 로그인 페이지 포함(실행결과가 아닌 소스를 포함시킨다)------ -->
<%@ include file="/login/login.jsp" %>
<!-- ------------------------------------------ -->
<ul>
<li><a href="<%=myctx%>/member/memberList.jsp">MemberList</a></li>
<li><a href="<%=myctx%>/beans/input.jsp">Beans Scope1</a></li>
<li><a href="<%=myctx%>/beans/input2.jsp">Beans Scope2</a></li>
<li><a href="<%=myctx%>/login/sessionTest.jsp">세션 테스트</a></li>
<li><a href="<%=myctx%>/login/memberTest.jsp">회원 인증 페이지</a></li>
<li><a href="<%=myctx%>/cookie/cookieTest.jsp"></a>쿠키 테스트</li>

</ul>
</nav>
<div id="cal"></div>
</aside>
<div class="clear"></div>
<!-- footer:하단 목록,Copyright -->
<footer>
푸터:Copyright
</footer>

=========================================================

//index.jsp - 화면 중간


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:include page="/top.jsp" />

    <H1>Index Page</H1>
 
    <jsp:include page="/foot.jsp"/>

=========================================================


일단 기본 포맷은 갖췄으나 아직 구성해야 할게 많이 남아있습니다.

그것은 다음 포스팅에서 계속해서 올리겠습니다.