발단

AWS에서 EC2로 우분투 서버를 구축해서 사용하던 중 벌써 1년이 됐다.

다음달 부터 비용을 지불하라는 메일에 겁이나서 다른 방법을 찾아보았다.

 

 

네이버

네이버도 클라우드 서비스를 하고 있고 micro서버에 한해서는 1년 무료사용 기한을 주지만

서버에 공인 IP를 적용하는데는 비용을 지불하라고해서 .. (정확히는 잘모르겠다ㅎㅎㅎ) 

여기도 포기했다.

 

 

호스팅업체 (가비아, 카페24)

차라리 호스팅 업체에 맡기는 건 어떨까? 어차피 테스트용이나 큰 트래픽이 나오지 않는 것 같아서

비용 얼마나 나오겠나.. 싶어서 시도했지만

괜히 그 비용이 아까웠다

내가 갖는 것도 아니고 결국 빌리는 거고 더 이상 비용 지불 의사가 없으면 내가 구축한 환경이 사라지는 것아닌가 싶었다.

 

 

개인 서버를 사자!

미니서버를 자서 구축하자니 미니라는 이름과 맞지 않게 비용이 대충 30만원 내외인 것 같았다.

단지.. 개발하고 테스트할 놀이터가 필요할 뿐인데...라는 생각이 들었다.

 

 

내 노트북을 개인 서버로 만들자!

그러기엔 하나부터 열까지 다 신경써야하고 단지 tomcat과 db를 올리기위해서 이런 노력이 필요할까? 

 

 

NAS를 사자!

결국 NAS를 샀다.

어차피 서버를 구축할 거라면 네트워크 스토리지 처럼 사용하면 일석 이조 아닌가!

알아보니 시놀로지가 매니저 프로그램도 잘 되어 있고 NAS에 Docker를 올릴 수있다는 사실을 알게되었다.

 

무려,,, 도커!!

NAS위에 도커 -> 도커위에 리눅스 -> 리눅스 위에 모든것이 가능 !

 

그래서 샀다 도커위에 MySQL도 올리고 , Apache 도 올리고 Tomcat도 올리고 더이상 고민할 필요가 없었다

 

대실패, DS118과 Docker

DS118을 구매했고 바로 신나서 세팅했다.

그러나 DS118은 도커를 올릴 수 없다. ㅜㅜㅜㅜㅜㅜㅜ

DS118은 32비트이기 때문에 Docker를 사용할 수 없다고 쓰여있다..

 

중고로 팔고 바꿀까도 했지만.. 난 너무 멀리온 듯 했다.

그리고 간김에 끝까지가기로 했다 ㅋㅋㅋㅋㅋㅋ

 

 

서버환경 구축 대작전

다행히 DS118은 apache는 구동되는 것으로 보인다.

그래서 DS118은 이제 부터 웹서버를 하기로 했다

그리고 집에 남아있는 노트북을 WAS/DB서버로 구축하기로했다.

노트북의 윈도우를 지우고 우분투를 설치했다. 

 

개요
GenericServlet을 확장한 HttpServlet 클래스 이용하여 서블릿 생성
클라이언트 요청을 GET, POST등으로 구분하여 처리
리다이렉트, 리프래시를 다루는 방법 학습
초기화 매개변수를 이용 설정 정보를 외부 파일에 두는 방법 및 서블릿에서 참고하는 방법
JDBC를 이용하여 데이터베이스회원 정보를 등록, 조회, 변경, 삭제
데이터베이스에서 데이터 가져오기
데이터베이스를 사용하기 위한 요소
1) JDBC 드라이버 : 데이터베이스를 요청, 전달, 결과를 받을 때 사용할 도구 자바에서 제공하는 DB와 통신하는 기술 자바에 데이터 베이스 접근하기 위해 필요
2) SQL : 데이터베이스에 명령을 내릴 언어
1. 회원 목록 조회 구현
샘플 데이터 생성
-- 샘플 테이블 생성 create table MEMBERS ( MNO integer not null comment '일련번호', EMAIL VARCHAR(40) not null comment '이메일', PWD VARCHAR(100) not null comment '암호', MNAME VARCHAR(50) not null comment '이름', CRE_DATE DATETIME not null comment '가입일', MOD_DATE DATETIME not null comment '마지막암호변경일' ) COMMENT '회원기본정보'; -- 제약조건, 인덱스 등 설정 ALTER TABLE MEMBERS ADD CONSTRAINT PK_MEMBERS PRIMARY KEY ( MNO ); CREATE UNIQUE INDEX UIX_MEMBERS ON MEMBERS (EMAIL ASC ); ALTER TABLE MEMBERS MODIFY COLUMN MNO INTEGER NOT NULL AUTO_INCREMENT COMMENT '회원일련번호'; -- 샘플데이터 입력 INSERT INTO MEMBERS(EMAIL, PWD, MNAME, CRE_DATE, MOD_DATE) VALUES ('s2@test.com','1111','임꺽정',NOW(),NOW()); INSERT INTO MEMBERS(EMAIL, PWD, MNAME, CRE_DATE, MOD_DATE) VALUES ('s3@test.com','1111','일지매',NOW(),NOW()); INSERT INTO MEMBERS(EMAIL, PWD, MNAME, CRE_DATE, MOD_DATE) VALUES ('s4@test.com','1111','이몽룡',NOW(),NOW()); INSERT INTO MEMBERS(EMAIL, PWD, MNAME, CRE_DATE, MOD_DATE) VALUES ('s5@test.com','1111','성춘향',NOW(),NOW());
SQL
JDBC 드라이버 준비
Type1 JDBC 드라이버 : 자바 실행환경 (Java Runtime Environment) 에 기본 포함 ODBC 드라이버를 사용
Type4 JDBC 드라이버 : MySQL 통신 프로토콜에 맞추어 데이터베이스와 직접 통신 ⇒ ODBC 드라이버를 필요로 하지 않음
서블릿 만들기
@WebServlet("/member/list") public class MemberListServlet extends GenericServlet { @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); conn = DriverManager.getConnection("jdbc:mysql://ec2-52-79-233-2.ap-northeast-2.compute.amazonaws.com/workbook?serverTimezone=Asia/Seoul", "workbook", "password"); stmt = conn.createStatement(); rs = stmt.executeQuery("select * from MEMBERS"); response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html><head><title>회원목록</title></head>"); out.println("<body><h1>회원목록</h1>"); while (rs.next()) { out.println( rs.getInt("MNO") + "," + rs.getString("MNAME") + "," + rs.getString("EMAIL") + "," + rs.getDate("CRE_DATE") + "<br>"); } out.println("</body></html>"); } catch(Exception e){ throw new ServletException(e); }finally { try {if (rs != null) rs.close();} catch(Exception e) {} try {if (stmt != null) stmt.close();} catch(Exception e) {} try {if (conn != null) conn.close();} catch(Exception e) {} } } }
Java
1) JDBC 관련 객체 선언
Connection conn = null; Statement stmt = null; ResultSet rs = null;
Java
2) JDBC API 예외 발생 대비
try { } catch(Exception e){ throw new ServletException(e); }finally { }
Java
서블릿에서 발생한 예외는 서블릿 컨테이너에 던짐
3) DriverManager가 사용할 JDBC 드라이버 등록
DriverManager.registerDriver( new com.mysql.jdbc.Driver()) // new com.mysql.jdbc.Driver() == java.sql.Driver 인터페이스 구현체
Java
java.sql.Driver 인터페이스 구현체
DriverManager에 등록됨
getMajorVersion(), getMinorVersion() : JDBC 드라이버 버전 제공
acceptsURL() : JDBC URL이 드라이버에서 사용가능한지 알려줌
connect() : 데이터베이스와 연결 수행 > Connect 객체 반환
4) DriverManager가 사용할 JDBC 드라이버 등록
DriverManager.registerDriver( new com.mysql.jdbc.Driver()) // new com.mysql.jdbc.Driver() == java.sql.Driver 인터페이스 구현체
Java
5) 데이터베이스에 연결
conn = DriverManager.getConnection("jdbc:mysql://ec2-52-79-233-2.ap-northeast-2.compute.amazonaws.com/workbook?serverTimezone=Asia/Seoul", "workbook", "password");
Java
DriverManager.getConnection(JDBC URL, DBMS 사용자 ID, DBMS 사용자 PW);
** JDBC URL의 구조
jdbc:mysql:thin:@localhost:3306:studydb // jdbc:mysql = 사용할 JDBC 드라이버 // thin = 드라이버 타입 // @localhost:3306 = 서버주소, 포트번호 // studydb = db 서비스 id
Java
⇒ java.sql.Connection 인터페이스 구현체 반환 : SQL을 실행할 객체를 얻을 수 있음
주요메서드
1) SQL문 실행 객체 반환 : createStatement(), prepareStatement(), prepareCall()
2) 트랜잭션 처리 수행 : commit(), rollback()
6) SQL 실행 객체 준비
stmt = conn.createStatement();
Java
⇒ java.sql.Statement 인터페이스 구현체 반환 : 데이터베이스에 질의하는 객체
주요 메서드
1) executeQuery() : 결과가 만들어지는 SQL문 실행 시 사용 (주로 SELECT 문에서 실행)
2) executeUpdate() : DML, DDL 실행시 사용
3) execute() : SELECT, DML, DDL 모두사용가능
4) executeBatch() : addBate()로 여러개의 SQL 등록, 한번에 실행
7) 데이터베이스에 SQL문 보내기
rs = stmt.executeQuery("select * from MEMBERS");
Java
⇒ java.sql.ResultSet 인터페이스 구현체 반환
주요 메서드
1) first() : 서버에서 첫번째 레코드 가져오기
2) last() : 서버에서 마지막 레코드 가져오기
3) previous() : 서버에서 이전 레코드 가져오기
4) next() : 서버에서 다음 레코드 가져오기
5) getXXX(컬럼명) : 특정 컬럼을 타입에 맞추어 가져오기 (getInt,getString,getDate ... )
6) updateXXX() : 특정 컬럼의 값을 변경
7) deleteRow() : 현재 레코드 지우기
8) select 결과 가져오기
while (rs.next()) { out.println( rs.getInt("MNO") + "," + rs.getString("MNAME") + "," + rs.getString("EMAIL") + "," + rs.getDate("CRE_DATE") + "<br>"); }
Java
rs.next() : t/f를 반환 다음이 있을 경우, rs 객체는 해당 레코드를 가져옴
9) JDBC 프로그래밍의 마무리
finally { try {if (rs != null) rs.close();} catch(Exception e) {} try {if (stmt != null) stmt.close();} catch(Exception e) {} try {if (conn != null) conn.close();} catch(Exception e) {} }
Java
finally에 자원을 해제하기 좋음
자원 해제 시 자원 선언의 역순으로 처리

+ Recent posts

"여기"를 클릭하면 광고 제거.