캡콤 최고의 벨트스크롤 액션게임!! '파이널 파이트'


이번 시간에 소개할 게임은 90년대 오락실을 강타했던

캡콤의 '파이널 파이트' 게임입니다


 바로 '파이널파이트'입니다!! 정말로 이 게임은 대단한 게임이죠.. 90년대 오락실에서 엄청난 인기를 끌었던.. 그당시 오락실게임계의 1박2일이라고 할까요..


 어쨋든 선택할수 있는 캐릭터는 이 3명입니다. 제가 가장 좋아하는 캐릭터는 코디입니다. 왜냐하면 밸런스가 가장 좋기때문이죠 ㅎㅎ


대충 스토리를 소개하자면..

 어느날 사무실에서 열심히 일하던 대도시 메트로 시티의 시장 마이크 해거는 뜻밖의 전화를 받습니다.. 그리고 전화에서 기분 나쁜 한 남자의 목소리가 들립니다.. "TV를 켜봐라"


TV를 킨 해거는 존나게 못생긴 매드 기어의 조직 깡패 녀석의 면상때기를 봅니다.. 그 깡패 녀석이 전화를 한 이유는..


바로 해거의 딸 제시카를 납치하고 있기 때문.. 가슴이 정말.. 남자 유저들이 빨리 구하고 싶은 욕구를 가지게 하는 몸매군요..

어쨋든 재빨리 코인 넣고 게임 시작!


 저 노란원숭이가 바리게이트를 치고 히죽히죽 쳐웃네요.. 빨리 족치러 가야겠죠?


파이널파이트에 대한 저의 생각을 말하자면..

 정말 파이널파이트는 너무 재밌습니다.. 단점이 없다시피.. 그냥 많이 하면 질린다는 단점이있죠.. 하지만 그런 단점은 모든 게임이 가지고 있죠..


 보스들보다 가끔씩 무서운 이녀석들은 '안도레 가족'이라고 불립니다.. 이녀석들의 롤모델이 있는데 아시나요?


 고인이 된 레슬링 선수 '앙드레 자이언트' 가 롤모델입니다.. 
캡콤 참 게임 재밌게 만드네요..


 이 무서운 레슬링선수와 저 박치기 하는 뚱보를 상대하기 싫다면 저 나무통 위에서 대기 타서 시간을 끄는것도 게임을 쉽게 할수 있는 또 하나의 요령입니다.


중간중간에 보너스탄도 사람들을 더 재밌게 만듭니다.. 참 적절하죠.. 강약조절을 잘 한다고 할까.. 캡콤의 리즈시절이라고 보면 되겠네요.

파이널 파이트의 보스를 잠깐 소개하자면..


슬럼가에 서식(?)하는 노란원숭이 댐드입니다. 저런 남자를 좋아하는 여자가 과연 있을까라는 의문이 들정도로 혐오스럽게 생겼습니다. 중간중간 웃음소리도 역겹죠..


지하철에 사는 보스 사무라이 소돔입니다. 스트리트 파이터 시리즈에도 나오죠 ㅎ 상대하기 좀 난감한 녀석입니다.. 칼로 얍삽하게 배고 갑자기 스피어 날리고 ㅋ


서부지구에 근무하는 부패한 경찰관 에디.E입니다.. 중간중간에 총을 쓰면 좀 황당하죠..


옥상 엘리베이터에서 잠복했던 로렌토입니다.. 가장 멋지게 죽음을 맞이하는 녀석입니다.. 수류탄을 자신에게 던지면서 자살을 하죠..


아 이녀석의 이름은 '아비가일'입니다. 진짜 무서운 녀석입니다.. 
갑자기 저런 공격 자세를 취하다가..


온몸이 홍당무가 되면서 공격을 빡~~하는데 파워가 장난이 아닙니다.. 에너지가 쭉 달죠.. 게다가 목도 졸라버리고.. 제일 상대하기 싫은녀석..


그리고 파이널파이트의 최종보스 벨거.. 휠체어에 탄 장애인인데 석궁을 쏩니다.. 
그 제시카를 만지는 더러운 손 치우지 못해!!


만약에 죽으면 엔딩씬은 이렇습니다..

바로 줄에 꽁꽁 묶여져 다이너마이트와 최후를 맞이하는데 현실적이면서 동전을 넣어 구하고 싶은 욕망이 들게끔하는 장면입니다.. 오락실 사장이 가장 좋아하던 장면 ㅋ


파이널파이트에 예쁜 악역 포이즌.. 그당시 그녀의 인기는 대단했습니다..


"나 아직까지도 피규어로도 나온 몸이라고"

파이널파이트가 얼마나 명작이고 재밌는 게임인지 여러가지 다양한 시리즈로 새로운 게임이 나왔습니다..


미니 파이널 파이트..


GBA용으로도 나왔으며..


격투게임은 물론..


캡콤VS마벨에도 나왔으니.. 얼마나 인기가 많았던 게임인지 알수 있습니다.

어쨋든 여러분들도..


최종보스 벨거를 무찌르고 엔딩신을 보시고..


므흣한 장면도 같이 즐기시길 바랍니다 ㅎ

숫자의 표현 알고리즘 문제

안녕하세요

이번 시간에도 재밌는 알고리즘 문제 하나 가지고 왔습니다.

이건 레벨4짜리 문제로 못풀거라고 생각하고 일단 도전했으나

기분 좋게 풀려서 올려봅니다.

문제는 다음과 같습니다.


수학을 공부하던 민지는 재미있는 사실을 발견하였습니다. 그 사실은 바로 연속된 자연수의 합으로 어떤 숫자를 표현하는 방법이 여러 가지라는 것입니다. 예를 들어, 15를 표현하는 방법은
(1+2+3+4+5)
(4+5+6)
(7+8)
(15)
로 총 4가지가 존재합니다. 숫자를 입력받아 연속된 수로 표현하는 방법을 반환하는 expressions 함수를 만들어 민지를 도와주세요. 예를 들어 15가 입력된다면 4를 반환해 주면 됩니다.



저의 풀이는 아래와 같습니다~!


public class Expressions {

public int expressions(int num) {
int answer = 0;
int[] arr = new int[num+1];
for(int i=0; i<num; i++){
arr[i] = i+1;
}

for(int j=0; j<arr.length-1; j++){
for(int sp=0; sp<arr.length-1; sp++){
arr[j]+=arr[sp+(j+1)];
if(arr[j]==num){
answer++;
break;
}else if(arr[j]>num){
break;
}
}
}
return answer;
}

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

}

알고리즘 노답인 저도 계속 머릿속으로 생각하니 풀어집니다.

포기하는 순간 끝이니 계속해서 도전해보십시오

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

안녕하세요

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

이건 레벨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);
}
}


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




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