김은옥씨가 지은 은노기의 JSP2.3 웹프로그래밍에 나오는 shoppingmall 프로그램을 돌려보기 위한 참고사항을 적어본다.

소스코드는 아래에 첨부한다.

shoppingmall.zip
3.43MB

이 프로그램은 데이터베이스로 MySQL을 사용하였다. 나는 v8.0.13을 사용하였다.

위 소스코드 중 WebContent/WEB-INF/sql/database.sql 파일을 참조한다.

다음과 같이 데이터베이스 및 사용자를 생성하고 권한을 부여해준다. (root 권한으로 실행한다.)

-- 은노기 shoppingmall 프로젝트
create database jsptest;
create user 'jspid'@'localhost' identified by 'jsppass';
create user 'jspid'@'%' identified by 'jsppass';
grant all privileges on jsptest.* to 'jspid'@'localhost';
grant all privileges on jsptest.* to 'jspid'@'%';
commit;

다음과 같이 테이블과 사용자 데이터를 추가한다.

create table member(
  id varchar(50) not null primary key,
  passwd varchar(16) not null,
  name varchar(10) not null,
  reg_date datetime not null
);

alter table member
     add (address varchar(100) not null,
          tel varchar(20) not null);
          
desc member;

insert into member(id, passwd, name, reg_date, address, tel) 
values('kingdora@dragon.com','1234','김개동', now(), '서울시', '010-1111-1111');

insert into member(id, passwd, name, reg_date, address, tel) 
values('hongkd@aaa.com','1111','홍길동', now(), '경기도', '010-2222-2222');

select * from member;

alter table member modify passwd varchar(60) not null;

create table board(
  num int not null primary key auto_increment,
  writer varchar(50) not null,
  subject varchar(50) not null,
  content text not null,
  passwd varchar(60) not null,
  reg_date datetime not null,
  ip varchar(30) not null,
  readcount int default 0,
  ref int not null,
  re_step smallint not null,
  re_level smallint not null
);

desc board;

--쇼핑몰

create table manager(
 managerId varchar(50) not null primary key,
 managerPasswd varchar(60) not null
);

insert into manager(managerId,managerPasswd)
values('bookmaster@shop.com','123456');

insert into manager(managerId,managerPasswd)
values('ksseo63@naver.com','ekffksxm0');

create table book(
  book_id int not null primary key auto_increment,
  book_kind varchar(3) not null,
  book_title varchar(100) not null,
  book_price int not null,
  book_count smallint not null,
  author varchar(40) not null,
  publishing_com varchar(30) not null,
  publishing_date varchar(15) not null,
  book_image varchar(16) default 'nothing.jpg',
  book_content text not null,
  discount_rate tinyint default 10,
  reg_date datetime not null
);

create table qna(
  qna_id int not null primary key auto_increment,
  book_id int not null,
  book_title varchar(100) not null,
  qna_writer varchar(50) not null,
  qna_content text not null,
  group_id int not null,
  qora tinyint not null,
  reply tinyint default 0,
  reg_date datetime not null
);

create table bank(
  account varchar(30) not null,
  bank varchar(10) not null,
  name varchar(10) not null
);

insert into bank(account, bank, name)
values('11111-111-11111','내일은행','오내일');

create table cart(
  cart_id int not null primary key auto_increment,
  buyer varchar(50) not null,
  book_id int not null,
  book_title varchar(100) not null,
  buy_price int not null,
  buy_count tinyint not null,
  book_image varchar(16) default 'nothing.jpg'
);

create table buy(
  buy_id bigint not null,
  buyer varchar(50) not null,
  book_id varchar(12) not null,
  book_title varchar(100) not null,
  buy_price int not null,
  buy_count tinyint not null,
  book_image varchar(16) default 'nothing.jpg',
  buy_date datetime not null,
  account varchar(50) not null,
  deliveryName varchar(10) not null,
  deliveryTel varchar(20) not null,
  deliveryAddress varchar(100) not null,
  sanction varchar(10) default '상품준비중'
);

데이터베이스 연동을 위한 설정은 WebContent/META-INF/context.xml을 참조한다.

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxWait="5000" name="jdbc/eun" password="jsppass" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/jsptest?useSSL=false" username="jspid"/>
</Context>

또한 MySQL JDBC Connector 파일도 자신이 사용하는 MySQL Server 버전에 맞추어 변경해 주어야 한다. 이것은 studyjsp와 shoppingmall 프로젝트의 WebContent/WEB-INF/lib 폴더 밑에 있는 JDBC Connecctor 라이브러리에 대하여 맞추어 주어야 한다. 나는 v8.0.13을 사용하므로 mysql-connector-java-8.0.13.jar로 변경해 주었다. (기존에는 5.x.x 버전을 사용)

사용자에 대한 암호를 암호화하기 위해서는 9장에 있는 cryptProcess.jsp를 구동해 주어야 한다. (http://localhost:8080/shoppingmall/ch09/cryptProcess.jsp)

이는 studyjsp 프로젝트 폴더에 있는 소스코드를 shoppingmall 프로젝트 폴더로 복사하여 사용하였다.

은노기의 JSP2.3 웹프로그래밍 9장 375p에 자세한 설명이 되어 있다.

다음은 ch09/cryptProcess.jsp 파일에 대한 내용이다.

<%@page import="ch09.update.UpdateDBBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.util.List" %>
<meta name="viewport" content="width=device-width,initial-scale=1.0"/>
<link rel="stylesheet" href="style.css"/>

<h3>암호화 전 내용</h3>
<jsp:include page="cryptProcessList.jsp" flush="false"/>

<%
  UpdateDBBean dbPro = UpdateDBBean.getInstance();
  dbPro.updateMember();
%>

<h3>암호화가 적용된 후 내용</h3>
<jsp:include page="cryptProcessList.jsp" flush="false"/>

또한 관리자 계정의 비밀번호도 암호화를 수행하여야 하며, 브라우저에서http://localhost:8080/shoppingmall/enc/cryptProcess.jsp를 수행하면 된다.

cryptProcess.jsp에 대한 소스 코드는 아래와 같다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.util.List" %>
<%@ page import = "mngr.enc.PassCrypt" %>
<meta name="viewport" content="width=device-width,initial-scale=1.0"/>

<%
  PassCrypt dbPro = PassCrypt.getInstance();
  dbPro.cryptProcess();
  out.println("암호화 성공! 꼭 한번만 수행");
%>
 

소스코드에 대한 동작을 확인하기 위해서는 관리자로 로그인하여 책에 대한 상품등록을 카테고리별로 3권씩 등록을 해주면 좋을 것 같다. (인터파크 등을 참고하면 쉽게 할 수 있음)

Posted by 세상을 살아가는 사람
,

이전 게시글에서는 회원정보를 사용하여 security를 통한 로그인 기능을 처리를 하였다. 세션 정보도 저장을 하였다.

여기서는 security 모듈에서 지정한 로그인 폼이 아니라 별도의 url을 사용하고 로그인 폼 및 처리를 하는 방법을 알아본다. url은 /member/login을 사용한다. 따라서 /member url을 처리하는 MemberController를 별도로 생성한다.

com.example.sboot.member.controller 패키지 밑에 MemberController를 다음과 같이 추가한다.

package com.example.sboot.member.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;

@Controller
@RequestMapping("/member")
@RequiredArgsConstructor
@Log4j2
public class MemberController {
	@GetMapping("/login")
	public void login() {
		log.info("login...");
	}
}

로그인 폼을 위해 templates/member 팀에 login.html을 다음과 같이 추가한다.

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<th:block th:replace="~{/layout/basic :: setContent(~{this::content} )}">
    <th:block th:fragment="content">
    	<script src="/js/login.js"></script>
    	
        <h1 class="mt-4">Login Page</h1>
        <form class="form-signin" method="post" action="/member/login">
        	<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
        	<h2 class="form-signin-heading">Please sign in</h2>
        	<p>
          		<label for="username" class="sr-only">Username</label>
        		<input type="text" id="username" name="username" class="form-control" placeholder="Username" th:value="${result}" required autofocus>
        	</p>
        	<p>
        		<label for="password" class="sr-only">Password</label>
        		<input type="password" id="password" name="password" class="form-control" placeholder="Password" required>
        	</p>
			<p><input type='checkbox' name='remember-me'/> Remember me on this computer.</p>
        	<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
        </form>
		<h2 class="form-signin-heading">Login with OAuth 2.0</h2>
		<table class="table table-striped">
 			<tr>
 				<td><a href="/oauth2/authorization/google">Google</a></td>
 			</tr>
		</table>
    </th:block>
</th:block>

로그인 폼 및 로그인 POST 처리를 위한 url을 /member/login으로 변경을 하였으므로 SecurityConfig.java 클래스의 시큐리티 설정 정보도 다음과 같이 변경한다.

package com.example.sboot.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

import com.example.sboot.security.service.CustomUserDetailsService;

import lombok.extern.log4j.Log4j2;

@Configuration
@Log4j2
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	@Autowired
    private CustomUserDetailsService userDetailsService;
	
	@Bean
    PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.formLogin().loginPage("/member/login");
		http.userDetailsService(userDetailsService);
		http.logout();
	}
}

login.html에서 파라미터의 유효성 검사를 처리하는 login.js는 다음과 같다. 아이디와 비밀번호에 대하여 유효성 검사를 한다. 유효성 검사가 통과되면 서버로 로그인 요청을 보낸다.

$(document).ready(function() {
	var useridValid = false;	// 아이디 유효성 검사 결과
	var passwordValid = false;	// 비밀번호 유효성 검사 결과
	
	var token = $("meta[name='_csrf']").attr("content");
	var header = $("meta[name='_csrf_header']").attr("content");
	
	var formObj = $(".form-signin");
	
	// 아이디 유효성 검사
	$("input[name='username']").on("keyup", function(e) {
		var regExp = /^[-A-Za-z0-9_]+[-A-Za-z0-9_.]*[@]{1}[-A-Za-z0-9_]+[-A-Za-z0-9_.]*[.]{1}[A-Za-z]{2,5}$/;
		if( !regExp.test($("input[name='username']").val()) ) {
			$("input[name='username']").css("color", "#EE5656");
			useridValid = false;
		}
		else {
			$("input[name='username']").css("color", "blue");
			useridValid = true;
		}
	});
	
	// 비밀번호 유효성 검사
	$("input[name='password']").on("keyup", function(e) {
		var regExp = /^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{5,15}$/;
		if( !regExp.test($("input[name='password']").val()) ) {
			$("input[name='password']").css("color", "#EE5656");
			passwordValid = false;
		}
		else {
			$("input[name='password']").css("color", "blue");
			passwordValid = true;
		}
	});

	$(".btn-primary").on("click", function(e) {
		e.preventDefault();
		var userid = $("input[name='username']").val();
		if(userid == null || userid.length == 0) {
			alert("아이디를 입력하세요");
			userid.focus();
			return;
		}

		if(useridValid == false) {
			alert("이메일 형식의 고유한 아이디를 사용하세요.");
			return;
		}
		
		var password = $("input[name='password']").val();
		if(password == null || password.length == 0) {
			alert("암호를 입력하세요");
			password.focus();
			return;
		}
		
		if(passwordValid == false) {
			alert("특수문자, 영문, 숫자의 조합으로 8자 이상 15자 이하를 사용하세요.");
			return;
		}

		console.log("submit clicked");
		formObj.submit();
	});
});

basic.html에서 절대경로를 고려하기 위하여 다음과 같이 수정하여 주어야 한다. thymeleaf에서 url은 th:를 붙여주고 @{}를 사용하여야 한다.

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<th:block th:fragment="setContent(content)">
<head>
<meta charset="utf-8" />
<meta name="viewport"
	content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="description" content="" />
<meta name="author" content="" />
<title>Simple Sidebar - Start Bootstrap Template</title>
<!-- Favicon-->
<link rel="icon" type="image/x-icon" th:href="@{/assets/favicon.ico}" />
<!-- Core theme CSS (includes Bootstrap)-->
<link th:href="@{/css/styles.css}" rel="stylesheet" />
<!-- Bootstrap core JS-->
<script
	src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<!-- Core theme JS-->
<script th:src="@{/js/jquery.min.js}"></script>
<script th:src="@{/js/scripts.js}"></script>
</head>
<body>
<div class="d-flex" id="wrapper">
	<!-- Sidebar-->
	<div class="border-end bg-white" id="sidebar-wrapper">
		<div class="sidebar-heading border-bottom bg-light">Start
			Bootstrap</div>
		<div class="list-group list-group-flush">
			<a class="list-group-item list-group-item-action list-group-item-light p-3"
				href="#!">Dashboard</a>
			<a class="list-group-item list-group-item-action list-group-item-light p-3"
				href="#!">Shortcuts</a>
			<a class="list-group-item list-group-item-action list-group-item-light p-3"
				href="#!">Overview</a>
			<a class="list-group-item list-group-item-action list-group-item-light p-3"
				href="#!">Events</a>
			<a class="list-group-item list-group-item-action list-group-item-light p-3"
				href="#!">Profile</a>
			<a class="list-group-item list-group-item-action list-group-item-light p-3"
				href="#!">Status</a>
		</div>
	</div>
	<!-- Page content wrapper-->
	<div id="page-content-wrapper">
		<!-- Top navigation-->
		<nav
			class="navbar navbar-expand-lg navbar-light bg-light border-bottom">
			<div class="container-fluid">
				<button class="btn btn-primary" id="sidebarToggle">Toggle
					Menu</button>
				<button class="navbar-toggler" type="button"
					data-bs-toggle="collapse"
					data-bs-target="#navbarSupportedContent"
					aria-controls="navbarSupportedContent" aria-expanded="false"
					aria-label="Toggle navigation">
					<span class="navbar-toggler-icon"></span>
				</button>
				<div class="collapse navbar-collapse" id="navbarSupportedContent">
					<ul class="navbar-nav ms-auto mt-2 mt-lg-0">
						<li class="nav-item active"><a class="nav-link" href="#!">Home</a></li>
						<li class="nav-item"><a class="nav-link" href="#!">Link</a></li>
						<li class="nav-item dropdown"><a
							class="nav-link dropdown-toggle" id="navbarDropdown" href="#"
							role="button" data-bs-toggle="dropdown" aria-haspopup="true"
							aria-expanded="false">Dropdown</a>
							<div class="dropdown-menu dropdown-menu-end"
								aria-labelledby="navbarDropdown">
								<a class="dropdown-item" href="#!">Action</a> <a
									class="dropdown-item" href="#!">Another action</a>
								<div class="dropdown-divider"></div>
								<a class="dropdown-item" href="#!">Something else here</a>
							</div>
						</li>
					</ul>
				</div>
			</div>
		</nav>
		<!-- Page content-->
		<div class="container-fluid">
			<th:block th:replace = "${content}"></th:block>
		</div>
	</div>
</div>
<script>
$("#sidebarToggle").click(function(e) {
    e.preventDefault();
    $("#wrapper").toggleClass("toggled");
});
</script>
</body>
</th:block>
</html>

로그인 폼은 다음과 같다.

우선은 비밀번호에 대한 유효성 검사를 잠시 막아 놓고 로그인을 수행한다. 잘 수행이 된다.

소스코드는 아래와 같다.

sboot.zip
0.23MB

Posted by 세상을 살아가는 사람
,

이 글에서는 스프링 부트를 사용하여 포트폴리오를 만드는 과정을 기술한다.

개발환경은 다음과 같다.

- IDE : STS4

- 자바 : JDK 11.0.7

- 데이터베이스 : MySQL 8.0.29

먼저 STS4를 이용하여 프로젝트를 생성한다.

STS4에서 메뉴 File->New->Spring Start Project를 선택한다.

아래 그림과 같이 설정하고 Next 버튼을 클릭한다.

다음과 같이 dependencies를 설정하고 Finish 버튼을 클릭한다.

Spring Boot DevTools, Lombok, Spring Data JPA, Spring Security, Thymeleaf, Spring Web을 설정해 주었다. 예를 들어 Available에서 security를 입력하면 Security->Spring Security 항목을 입력할 수 있다.

아래 그림과 같은 폴더가 Package Explorer에서 생성됨을 알 수 있다.

build.gradle 파일을 열어보면 다음과 같은 정보가 있음을 알 수 있다.

plugins {
	id 'java'
	id 'war'
	id 'org.springframework.boot' version '2.7.6'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.projectlombok:lombok'
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'
}

tasks.named('test') {
	useJUnitPlatform()
}

추가로 MySQL connector-java 라이브러리를 build.gradle dependency 부분에 추가한다.

	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'
	
	implementation("mysql:mysql-connector-java:8.0.29")	// 추가된 부분
}

 

데이터베이스 연동을 위해 MySQL 데이터베이스에서 database myapp을 생성하고, 사용자 'bootuser'@'localhost'와 'bootuser'@'%'를 추가하고, 사용자에게 테입터베이스 접근 권한을 부여한다.

-- 데이터베이스 생성

create database myapp;

-- 사용자 생성
create user 'bootuser'@'localhost' identified by 'bootuser';	-- 서버에서 접속할 수 있는 사용자
create user 'bootuser'@'%' identified by 'bootuser';			-- 다른 컴퓨터에서 접속할 수 있는 사용자

-- 권한 부여
grant all privileges on myapp.* to 'bootuser'@'localhost';
grant all privileges on myapp.* to 'bootuser'@'%';

-- 디스크에 저장
commit;

프로젝트의 설정 파일 application.properties 파일은 다음과 같다. JDBC 연동을 위한 Database 설정과 Spring Data JPA를 위한 설정을 추가하고, security 로그를 위한 설정을 추가한다.

# Database
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/myapp
spring.datasource.username=bootuser
spring.datasource.password=bootuser

# Spring Data JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true

spring.thymeleaf.cache=false

# security
logging.level.org.springframework.security.web= debug
logging.level.kr.talanton.sboot.security = debug

아직 security를 위한 설정은 추가되지 않은 상태이다.

마우스로 프로젝트를 선택하고 우클릭 후 Gradle->Refresh Gradle Project를 선택하여 필요한 라이브러리를 다운로드 받는다. Project and External Dependencies에서 build.gradle에 설정한 라이브러리가 존재하는지 확인해 본다.

아래와 같이 기본 테스트 코드를 추가한 후 테스트 코드를 실행한다.

package com.example.sboot;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SbootApplicationTests {

	@Test
	void contextLoads() {
		System.out.println("context loaded");
	}
}

간단하게 context가 로딩이 되는지 확인할 수 있는 코드이다. 테스트 코드를 마우스로 선택한 후 우클릭하고 Run AS->JUnit Test를 선택한다.

위 그림과 같이 security를 위한 user의 password가 추력되고, 테스트가 수행되어 context loaded가 출력됨을 알 수 있다.

또한 JUnit 테스트 수행결과가 표시됨을 알 수 있다.

소스 코드는 다음과 같다.

sboot.zip
0.08MB

Posted by 세상을 살아가는 사람
,

PC 환경변수란?

자바 2022. 7. 13. 22:42

PC에서 사용자가 현재 작업 폴더에서 어떤 프로그램을 실행하기 위해서는

그 실행 프로그램이 어디에 위치하는지를 알아야 한다.

위의 그림에서 작업 폴더가 C:\Users\ksseo\Desktop에 위치한다고 가정하고

현재 PC에 존재하는 JVM(자바)의 버전 정보를 출력하기 위하여 java -version 명령어를 cmd창에서 입력한다.

보통 환경변수 path에 java.exe가 존재하는 경로를 설정하지 않았을 경우는 java.exe가 존재하는 경로를 포함하여 java.exe를 실행하여야 한다.

즉, 절대 경로를 사용하거나 상대경로를 사용하여 java.exe 명령어를 싷행하여야 한다.

예를 들어 절대경로를 사용할 경우는 "C:\Program Files\java\jdk1.8.0.311\bin\java" -version을 입력하여야 한다.

상대 경로를 사용할 경우는 현재 작업 폴더의 위치를 기반으로 java.exe 파일이 존재하는 위치를 알려주어야 한다. 즉, "..\..\Program Files\java\jdk1.8.0_311\bin\java" -version을 입력하여야 한다.

그러면 위의 그림과 같은 결과가 나타날 것이다.

그러나 이것은 효과적이지 못하다. 조금 복잡하다. 그냥 위의 그림과 같이 java -version과 같이 간단하게 실행파일의 이름만 사용하는 것이 편리하다. 그래서 그러한 방법을 제공하는 것이 환경변수 path이다.

cmd tool은 PC의 환경변수 path를 읽어둘여 실행파일이 환경변수 path 밑에 존재하는지를 먼저 check한후 있을 경우 그 실행파일을 실행한다.

이와 같이 내 작업 폴더와 다른 위치에 존재하는 실행파일을 실행하려면 환경변수 path에 실행하고자 하는 파일이 어디에 존재하는지를 설정해주면 작업자가 어느 위치에 있던지 관계없이 바로 실행파일의 이름만을 사용하여 실행할 수 있다.

Posted by 세상을 살아가는 사람
,

라즈베리파이에서 최신 라즈비안 OS인 Jessie를 사용하여 static IP address를 사용하려고 하였더니 어려움이 있었다.

Jessie 버전이 dhcpcd5를 default로 사용하다보니 혼동이 있다.

이에 정리를 해본다.

우선 문제가 DNS 서버에 대한 주소를 어떻게 설정하느냐 인데, 보통 DHCP를 사용하면 DHCP 서버로부터 DNS 서버 주소를 가져오기 때문에 자동으로 설정이 된다.

그래서 /etc/resolv.conf 파일을 보면 DNS 서버 주소가 저장이 되고 그것을 사용해서 DNS 프로토콜이 동작을 하고 domain name에 대한 IP address를 가지고 와서 연결을 해 나간다.

그러나 static IP address를 사용하면 DHCP를 사용하는 것이 아니기 때문에 DNS 서버 주소를 어디에선가 설정을 해주어야 한다.

착각할 수 있는 것이 /etc/dhcpcd.conf에서 static domain_name_server=192.168.0.1 8.8.8.8 이라고 마치 설정을 해주는 것 같은데, 실질적으로 동작을 하지 않는다.

그래서 /etc/network/interfaces에 domain name server 주소를 설정해 주어야 한다. 또한 auth eth0도 꼭 넣어주어야 한다. 즉,

auto eth0

iface eth0 inet manual

dns-nameservers 168.126.63.1 168.126.63.2


/etc/dhcpcd.conf 파일은

interface eth0

static ip_address=192.168.0.142/24

static routers=192.168.0.1

static domain_name_server=168.126.63.1 168.126.63.2 8.8.8.8


Posted by 세상을 살아가는 사람
,

PC의 HDD를 교체하여 새롭게 오라클 데이터베이스 11g를 설치하여 본다.

1. http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html에 접속하여

  Oracle Database 11g Release 2 Microsoft Windows (x64) See All (2개로 구성)을 다운로드 받는다.

2. 압축을 풀고, 하나의 디렉토리로 합쳐 준다.

3. setup.exe를 클릭하여 설치를 시작

4. My Oracle Suuport를 통해 보안 갱신 수신(W) 항의 체크를 해제하고 다음 버튼 클릭

5. 설치 옵션으로 데이터베이스 생성 및 구성을 선택하고 다음 버튼 클릭

6. 데스크톱 클래스(D)를 선택하고 다음 버튼 클릭

7. 디렉토리 및 비밀번호 설정

  - 적당한 경로를 입력

  - 문자집합을 유니코드(AL32UTF8)로 수정

  - 관리 비밀번호를 입력

8. 설정을 확인하고 응답파일을 설치 디렉토리에 저장 후 완료 버튼을 누름

9. 설치가 다 되면 확인을 해 본다.

  - 시작메뉴>Oracle - OraDb11g_home1>응용 프로그램 개발>SQL Plus를 선택

  - 로그인 창에서 로그인 : user name은 system

  - SQL> 프롬프트가 나온다.

10. 사용자와 권한 부여

  - SQL> create user username identified by password;

  - SQL> grant connect, resource, dba to username;

11. DBMS 관리포트 변경

  - 오라클 설치 시, 8080 포트로 되어 있어 Tomcat과 같은 포트를 사용하므로 수정한다.

  - SQL> exec DBMS_XDB.SETHTTPPORT(9000);

Posted by 세상을 살아가는 사람
,