Day63

2021. 1. 12. 13:21교육과정/KOSMO

키워드 : 파이썬 모듈 (참조 방식) / __init__.py / 파이썬에서 프로그램 시작점 / __name__ / 파이썬 클래스 / 클래스 상속 / 인스턴스 함수와 클래스 함수 / 매직 메소드 /  리눅스 JDK 설치 / 리눅스 Tomcat 설치 / 리눅스에서 war 파일로 스프링 프로젝트 페이지 접속하기 / 리눅스 oracle 설치

 

****

 

1. 파이썬 모듈 개념

 

    * 함수 : 파일 내에서 일정한 작업을 수행하는 코드 블록
    * 모듈 : 함수나 클래스들의 파일
               모듈이름은 py 확장자를 제외한 파일 이름
    * 패키지 : 여러 모듈들을 모아놓은 디렉토리
                  패키지 = 디렉토리
                  모듈 = 파일(클래스들, 함수들)
    [ 모듈 ]
    - 자주 사용되는 함수를 매번 작성하지 않고 하나의 모듈로 사용하여 재사용
    - 모듈 단위로 분리하여 설계함으로 작업의 효율을 높임
    - 동일한 함수나 클래스를 모듈로 관리

        ` 표준 모듈 : 파이썬 안에 기본적으로 제공하는 모듈
        ` 사용자 정의 모듈 : 개발자가 직접 정의한 모듈

예를 들어, 

다음은 get_weather( )라는 함수와 get_date( )라는 함수가 들어있는 모듈 mymodule.py 이다. 

from random import choice

def get_weather():
    today = ['맑음','비','눈','폭우','돌풍','따뜻'] 
    return choice(today)

def get_date():
    today = ['월','화','수','목','금','토','일']
    return choice(today)

(+) choice( ) 는 랜덤하게 리스트에서 추출해주는 함수이다. 

 

 


2. 파이썬 모듈을 참조하는 방식

 

(1) 모듈 전체를 참조할 수 있다. 

    ① 모듈 전체를 import 한 뒤

import mymodule

    ② 들어있는 함수나 클래스를 호출하여 사용한다. 

today = mymodule.get_weather()
print('오늘의 날씨 : ', today)
print('오늘은 ', mymodule.get_date(), '요일입니다.')

   ③ 실행결과 무작위로 날씨와 요일이 출력된다. 

오늘의 날씨 :  비
오늘은  월 요일입니다.

(2) 별칭 부여 가능 --- 이 경우 별칭으로만 함수를 호출해야 한다. 

import mymodule as mm

today = mm.get_weather()
print('오늘의 날씨 : ', today)
print('오늘은 ', mm.get_date(), '요일입니다.')

(3) 모듈에서 필요한 부분만 import 할 수 있다. 

     특정 함수만 필요할 때 사용하며, import 하지 않은 나머지 함수는 사용할 수 없다. 

from mymodule import get_weather

today = get_weather()
print('오늘의 날씨 : ', today)
# print('오늘은 ', mymodule.get_date(), '요일입니다.') ... get_date() 는 import되지 않아 사용불가

# 실행결과
'''
오늘의 날씨 :  비
'''

(4) 모듈에서 필요한 부분만 import 한 뒤 별칭을 부여할 수 있다. 

from mymodule import get_weather as mm

today = mm()
print('오늘의 날씨 : ', today)

# 실행결과
'''
오늘의 날씨 :  눈
'''

 


3. 예제 실습 - 함수를 작성하고 다른 파일에서 import 하기

 

(1) 다음과 같은 정의를 만족하는 함수를 작성한다. 

    * deohagi 함수 정의
        - 2개의 인자를 받아서 더한 값을 리턴한다.
        - 그러나 자료형이 다르면,
            "자료형이 달라서 계산 할 수 없다"라고 출력하고
             같은 자료형인 경우에만 더한 값이 리턴한다.
def deohagi(a,b):
    if type(a) == type(b):
        return(a+b)
    else:
        return('자료형이 달라서 계산 할 수 없습니다.')

print(deohagi(1,2))
print(deohagi('hello','jack'))
print(deohagi('hi',100))

# 실행결과
'''
3
hellojack
자료형이 달라서 계산 할 수 없습니다.
'''

 

(2) 새로운 exfile.py 파일 생성 후 deohagi( ) 함수만 호출하여 사용한다. 

from exmodule import deohagi

print(deohagi(1,2))
print(deohagi('hello','jack'))
print(deohagi('hi',100))

또는

import exmodule

print(exmodule.deohagi(1,2))
print(exmodule.deohagi('hello','jack'))
print(exmodule.deohagi('hi',100))

4. 함수가 여러 개일 경우 실행 순서를 지정하기

 

※ 여러개의 py 파일이 있을 때, 특정 파일부터 시작하기 위해 시작점을 지정할 수 있다.

    (JAVA 에서 main( ) 가 있는 특정 파일이 존재했던 것과 같은 상황을 만들 수 있다. )

※ 단, 파일 내에서는 1라인부터 차례대로 수행한다. 

※ 일반적인 변수명과 구별하기 위해 언더바 _ _ 를 사용한다. 

if __name__ == '__main__':
    print(deohagi(1,2))
    print(deohagi('hello','jack'))
    print(deohagi('hi',100))
if __name__ == '__main__': 
       프로그램 시작점이며, 메인함수과 같은 역할을 한다. 

 

※ 인터프리터(CMD)에서 직접 실행할 경우, if 안의 내용이 수행된다. ( import된 경우에는 구동하지 않음 )

※ 자세한 내용 참고 : medium.com/@chullino/if-name-main-%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C-bc48cba7f720

 

   파이썬은 최초로 시작하는 스크립트 파일과 모듈의 차이가 없습니다.
   어떤 스크립트 파일이든 시작점도 될 수 있고, 모듈도 될 수 있습니다.
   그래서 __name__ 변수를 통해 현재 스크립트 파일이 시작점인지 모듈인지 판단합니다.

   if __name__ == '__main__':처럼 __name__ 변수의 값이 '__main__'인지 확인하는 코드는
   현재 스크립트 파일이 프로그램의 시작점이 맞는지 판단하는 작업입니다.
   즉, 스크립트 파일이 메인 프로그램으로 사용될 때와 모듈로 사용될 때를 구분하기 위한 용도입니다.

   [참고] 파이썬은 왜 프로그램의 시작점이 정해져 있지 않나요?

   파이썬이 처음에 개발 될 당시에는 리눅스/유닉스에서 사용하는 스크립트 언어 기반이었기 때문에 
   프로그램의 시작점이 따로 정해져 있지 않았습니다. 
   보통 리눅스/유닉스의 스크립트 파일은 파일 한 개로 이루어진 경우가 많은데, 
   이 스크립트 파일 자체가 하나의 프로그램이다 보니 시작점이 따로 필요하지 않습니다. 
   하지만 C 언어나 자바같은 언어는 처음 만들어질 때부터 소스 파일을 여러 개 사용했기 때문에 
   여러 소스 파일의 함수들 중에서도 시작 함수(main)를 따로 정해 놓았습니다.
   프로그램 자동화가 필요할 경우,
      (1) 쉘 스크립트로 작성하거나
   (2)     파이썬으로 쉘 스크립트 대신 작성해서 처리할 수 있다. (쉘 프로그래밍이 어렵기 때문)

그러나 파이썬은 쉘 스크립트만큼의 속도가 나지 않기 때문에 다시 쉘 스크립트로 돌아가기도 한다. 

 


5. if__name__ == "__main__" 예제

 

※ first.py

print('first 모듈 시작')
print('first.py __name__:', __name__)    # __name__ 변수 출력
print('first 모듈 끝')

# 실행결과
'''
first 모듈 시작
first.py __name__: __main__
first 모듈 끝
'''

※ second.py

import first

print('second.py __name__:', __name__)  # __name__ 변수 출력

# 실행결과
'''
first 모듈 시작
first.py __name__: first
first 모듈 끝
second.py __name__: __main__
'''

▶ 참조한 파일에서 실행된 결과와 현재 파일에서 실행된 결과를 구분할 수 있다. 

▶ __name__ 은 인터프리터 실행 전에 만들어지는 글로벌 변수이다. 


6. __init__.py 파일의 역할

    해당 디렉토리가 파이썬 패키지임을 알려주는 역할을 하는 함수
    파이썬 3.3 버전 이후 없어도 됨
    버전이 낮을 경우에는 __init__.py 파일이 필요하다.

 


7. __init__.py 파일 예제

 

(1) __init__.py 파일이 들어있는 c_module_class/mypack 디렉토리로 mymodule.py 파일을 옮긴다. 

   ※ mymodule.py

from random import choice

def get_weather():
    today = ['맑음','비','눈','폭우','돌풍','따뜻']
    return choice(today)

def get_date():
    today = ['월','화','수','목','금','토','일']
    return choice(today)

 

(2) c_module_class 디렉토리에 myfile2.py 파일 생성 후 mymodule.py 를 import 한다.

import mypack.mymodule

today = mypack.mymodule.get_weather()
print('오늘의 날시 : ', today)
print('오늘은 ', mypack.mymodule.get_date(), '요일입니다. ')

# 실행결과
'''
오늘의 날시 :  폭우
오늘은  화 요일입니다. 
'''

 

(3) import 할 때 별칭을 부여해서 사용하거나 일부 함수만 가져와서 사용할 수도 있다. 

※ 별칭 부여

import mypack.mymodule as mini

today = mini.get_weather()
print('오늘의 날시 : ', today)
print('오늘은 ', mini.get_date(), '요일입니다. ')

 

※ 일부 함수만 가져오기

from mypack.mymodule import get_weather

today = get_weather()
print('오늘의 날시 : ', today)

 

※ 일부 함수만 가져온 뒤 별칭 부여하기

from mypack.mymodule import get_weather as mini2

today = mini2()
print('오늘의 날시 : ', today)

 


8. 디렉토리 구조 내에서 특정 패키지를 import 하여 사용하기

 

(1) c_module_class/ mypack / exam 안에 exmodule.py 파일이 위치한다. 

def deohagi(a,b):
    if type(a) == type(b):
        return(a+b)
    else:
        return('자료형이 달라서 계산 할 수 없습니다.')

 

(2) c_module_class 디렉토리에 exfile2.py 파일을 생성하고 deohagi( ) 함수를 호출한다. 

from mypack.exam.exmodule import deohagi

deohagi(2,1)

또는

from mypack.exam.exmodule import *

deohagi(2,1)

9. 모듈 연습문제

 

(1) 패키지(packages)에 대한 설명 중 틀린 것은?

    ① 다양한 모듈의 합으로 디렉터리로 연결된다.

    ② 하나의 대형 프로젝트를 만드는 코드의 묶음이다.

    ③ 개별 .py 파일을 의미한다.

    ④ 다양한 오픈소스들이 관리되는 방법이다.

    ⑤ _ _init_ _, _ _main_ _ 등 키워드 파일명이 사용된다.

답 : ③ 

(풀이)

 개별 .py 파일을 의미한다. -----> 모듈에 관한 설명이다. 

 

(2) ‘game’이라는 패키지를 만들고 싶다고 가정하자.

     패키지를 만들기 위해 디렉터리별로 필요한 모듈을 구현하고자 한다.

     다음 그림에서 빈칸에 들어가야 할 파일은?

    ➀ __main__          ➁ import game        ➂ __init__.py

    ➃ __main__.py      ➄ __init__

답 : ③ __init__.py

 

(3) 두 코드 파일인 ‘fah_converter.py’와 ‘module_ex.py’는 같은 디렉터리에 있다.

     다음과 같은 결과값을 얻기 위해 빈칸에 들어갈 적합한 코드를 쓰시오.

   ※ fah_converter.py

def covert_c_to_f(celsius_value):
    return celsius_value * 9.0 / 5 + 32
test_value = 0

   ※ module_ex.py

(__________________)

print ("Enter a celsius value: ")
celsius = float(input())
fahrenheit = fah.covert_c_to_f(celsius)
print ("That's ", fahrenheit, " degrees Fahrenheit")

# 실행결과
'''
Enter a celsius value:
100
That's 212.0 degrees Fahrenheit
'''

답 : import fah_converter as fah

 

(4) 모듈을 호출하는 방법이 아닌 것은?

    ➀ import os                        ➁ import os as *

    ➂ from os import listdir         ➃ from os import *

    ➄ import os as linuxos

답 : ②

 

(5) ‘calculator_input.py’는 사칙연산 프로그램이다. 다음 빈칸을 채워 프로그램을 완성하시오.

   ※ calculator.py

def sum_func(a, b):
    return a + b
def multiply_func(a,b):
    return a * b
def minus_func(a,b):
    return a -b
def devide_func(a,b):
    return a / b

   ※ calculate_input.py

(_____________________)


user_input = input("사칙연산 프로그램: ").split(" ")

first_val , second_val = int(user_input [0]), int(user_input [2])
fourcal = user_input[1]
if fourcal == "+":
    result = sum_func(first_val , second_val)
elif fourcal == "-":
    result = minus_func(first_val , second_val)
elif fourcal == "/":
    result =devide_func(first_val , second_val)
else:
    result =multiply_func(first_val , second_val)
print("실행 결과는", result)

# 실행결과
'''
사칙연산 프로그램 : 5 * 4
실행 결과는 20
'''

답 : from calculator import *

 


10. 파이썬 클래스

 

(1) 클래스 생성 및 클래스의 객체 생성

   * 클래스 생성하기
class Sample:
    data = 'hello'
   * 클래스의 객체 생성하기
s = Sample()
print(s.data)

# 실행결과
'''
hello
'''

 

(2) 클래스의 생성자 역할을 하는 __init__(self)

   * def __init__(self) : 는 생성자 역할을 하며, 여기서 self는 this의 의미로 Sample 클래스를 가리킨다. 
     생성자 안에서 self 를 붙여 멤버변수를 선언할 수 있다. 
# 생성자에서 아무것도 하지 않으려면 pass를 기술한다. 
def __init__(self):
    pass
class Sample:
    data = 'hello'

    # 생성자 역할
    def __init__(self):
        self.age = 25 
        self.name = '홍길동'
        print('__init__')

 

s = Sample()
print(s.data)
print(s.age)
print(s.name)

# 실행결과
'''
__init__
hello
25
홍길동
'''

 

(3) 클래스의 소멸자 역할을 하는 __del__(self):

   * 클래스가 끝나는 지점을 알려준다. 
class Sample:
    data = 'hello'

    def __init__(self):
        self.age = 25      
        self.name = '홍길동'
        print('__init__')

    def __del__(self):
        print('__del__')

 

s = Sample()
print(s.data)
print(s.age)
print(s.name)
print('프로그램 종료')

# 실행결과
'''
__init__
hello
25
홍길동
프로그램 종료
__del__
'''

 

(4) 클래스의 메모리를 해제하려면 del 키워드를 사용한다. 

s = Sample()
print(s.data)
print(s.age)
print(s.name)
del s
print('프로그램 종료')

# 실행결과
'''
__init__
hello
25
홍길동
__del__
프로그램 종료
'''

 


11. 인스턴스 함수와 클래스 함수

 

    인스턴스 함수 :  'self'인 인스턴스를 인자로 받고 인스턴스 변수와 같이 
                          하나의 인스턴스에만 한정된 데이터를 생성, 변경, 참조
    클래스   함수 :  'cls'인 클래스를 인자로 받고 모든 인스턴스가 공유하는 
                          클래스 변수와 같은 데이터를 생성, 변경 또는 참조
     
    - 클래스 함수는 클래스명 접근

(1) 인스턴스 함수

class Book:
    cnt = 0

    def __init__(self, title):
        # 매개변수(지역)을 멤버변수로 지정
        self.title = title;

    # 인스턴스 함수 : 클래스 안의 일반 함수
    def output(self):
        print('제목: ', self.title) #........... 인스턴스 함수는 생성자 안의 멤버변수와 클래스 안의 변수 모두 접근할 수 있다. 
        self.cnt += 1
        print('갯수: ', self.cnt)

 

b1 = Book('정의란')
b2 = Book('다이어트란')
b1.output()
b2.output()

# 실행결과
'''
제목:  정의란
갯수:  1
제목:  다이어트란
갯수:  1
'''

 

(2) 클래스 함수

class Book:
    cnt = 0

    def __init__(self, title):
        # 매개변수(지역)을 멤버변수로 지정
        self.title = title;

    # 클래스 함수
    @classmethod
    def output2(cls):
#       print('제목: ', cls.title) ......... 클래스 함수에서는 생성자에서 지정된 멤버변수에 접근하지 못한다. 
        cls.cnt += 1
        print('갯수: ', cls.cnt)

 

b1 = Book('정의란')
b2 = Book('다이어트란')
b1.output2()
b2.output2()

# 실행결과
'''
갯수:  1
갯수:  2
'''

 

(3) 클래스명으로 클래스함수 호출하기

     : 객체를 생성하지 않고도 클래스명으로 함수를 호출하여 사용할 수 있다. 

# Book.output() ...... 에러 발생
Book.output2()

# 실행결과
'''
갯수:  1
'''

 


12. 클래스 상속

 

        - 파이썬은 method overriding은 있지만 method overloading 개념은 없다
        - 파이썬은 다중상속이 가능
        - 부모 클래스가 2개 이상인 경우 먼저 기술한 부모클래스에서 먼저 우선 해당 멤버를 찾음

 

(1) 클래스 생성 시 괄호( ) 안에 들어있는 이름이 부모 클래스가 된다. 

class Animal:
    def move(self):
        print('동물은 움직인다')

class Wolf(Animal):     # 늑대는 동물을 상속한다.
    def move(self):     # 오버라이딩
        print('늑대는 네 발로 달린다. ')

 

(2) Wolf 의 객체 생성 후 함수를 호출하면 오버라이딩 된 자식 클래스의 함수 결과가 출력된다. 

w = Wolf()
w.move()

# 실행결과
'''
늑대는 네 발로 달린다. 
'''

 

(3) 부모 클래스가 2개 이상인 경우에는 먼저 기술한 부모 클래스에서 해당 멤버를 찾아 출력한다. 

class Animal:
    def move(self):
        print('동물은 움직인다')

class Wolf(Animal):     # 늑대는 동물을 상속한다.
    def move(self):     # 오버라이딩
        print('늑대는 네 발로 달린다. ')
        
class Human(Animal):	# 사람은 동물을 상속한다. 
    def move(self):     # 오버라이딩
        print('사람은 두 발로 걷는다.')

class WolfHuman(Wolf,Human):	# 늑대인간은 늑대와 사람을 상속한다. 
    def move(self):             # 오버라이딩
        print('늑대인간은 두 발로 달린다.')        
        super().move()        

class WolfHuman2(Human, Wolf):  # 늑대인간은 사람과 늑대를 상속한다. 
    def move(self):     # 오버라이딩
        print('늑대인간은 두 발로 달린다.')
        super().move()

 

wh = WolfHuman()
wh.move()

wh2 = WolfHuman2()
wh2.move()

# 실행결과
'''
늑대인간은 두 발로 달린다.
늑대는 네 발로 달린다. 

늑대인간은 두 발로 달린다.
사람은 두 발로 걷는다.
'''

 

 

※ 생성자 오버로딩 관련 참고 gongmeda.tistory.com/12


13. 파이썬 매직 메소드

 

Binary Operators

Comparison Operators

Extended Assignments

Unary Operators


 Binary Operators

     Operator	          Method
     
        +	    object.__add__(self, other)
        -	    object.__sub__(self, other)
        *	    object.__mul__(self, other)
        //	    object.__floordiv__(self, other)
        /	    object.__div__(self, other)
        %	    object.__mod__(self, other)
        **	    object.__pow__(self, other[, modulo])
        >>	    object.__lshift__(self, other)
        <<	    object.__rshift__(self, other)
        &	    object.__and__(self, other)
        ^	    object.__xor__(self, other)
        |	    object.__or__(self, other)  

 Comparison Operators

     Operator	          Method
     
        <	    object.__lt__(self, other)
        <=	    object.__le__(self, other)
        ==	    object.__eq__(self, other)
        !=	    object.__ne__(self, other)
        >=	    object.__ge__(self, other)
        >	    object.__gt__(self, other)

 Extended Assignments

     Operator	          Method
     
        +=	    object.__iadd__(self, other)
        -=	    object.__isub__(self, other)
        *=	    object.__imul__(self, other)
        /=	    object.__idiv__(self, other)
        //=	    object.__ifloordiv__(self, other)
        %=	    object.__imod__(self, other)
        **=	    object.__ipow__(self, other[, modulo])
        <<=	    object.__ilshift__(self, other)
        >>=	    object.__irshift__(self, other)
        &=	    object.__iand__(self, other)
        ^=	    object.__ixor__(self, other)
        |=	    object.__ior__(self, other)     

 Unary Operators

     Operator	          Method
     
        -	        object.__neg__(self)
        +	        object.__pos__(self)
        abs()	    object.__abs__(self)
        ~	        object.__invert__(self)
        complex()	object.__complex__(self)
        int()	    object.__int__(self)
        long()	    object.__long__(self)
        float()	    object.__float__(self)
        oct()	    object.__oct__(self)        
        hex()	    object.__hex__(self)     

(0) 연습을 위한 기본 클래스 구조

class Sample:
    def __init__(self, name, age):
        self.name = name
        self.age = age

s = Sample('홍길자', 33)
print(s)

# 실행결과
'''
<__main__.Sample object at 0x0000023821803788>
'''

 

(1) def _ _ str _ _ ( self ) : 

    생성자에서 지정된 멤버 변수의 값을 출력하기 위해

    JAVA의 toString( )  같은 개념으로 def __str__(self) : 를 사용할 수 있다. 

class Sample:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def __str__(self):
        return ('이름:{} \n나이:{}'.format(self.name, self.age))

s = Sample('홍길자', 33)
print(s)

# 실행결과
'''
이름:홍길자 
나이:33
'''

 

(2) def _ _ add _ _ ( self ) : 

    생성자에서 지정된 멤버 변수의 값에 더하기 연산 결과를 출력하기 위해

    def __add__(self) : 를 사용할 수 있다. 

class Sample:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return ('이름:{} \n나이:{}'.format(self.name, self.age))

    def __add__(self, other):
        self.age += other

s = Sample('홍길자', 33)
s + 10
print(s)

# 실행결과
'''
이름:홍길자 
나이:43
'''

 

(3) def _ _ ge _ _ ( self ) : 

    생성자에서 지정된 멤버 변수의 값과 특정 값을 비교한 결과를 출력하기 위해

    def __ge__(self) : 를 사용할 수 있다.  

 

class Sample:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return ('이름:{} \n나이:{}'.format(self.name, self.age))

    def __add__(self, other):
        self.age += other

    def __ge__(self, other):
        if self.age > other:
            return '연상입니다.'
        else:
            return '연하입니다.'

s = Sample('홍길자', 33)
s + 10
print(s)
print(s >= 30)

# 실행결과
'''
이름:홍길자 
나이:43
연상입니다.
'''

 


14. 파이썬 클래스 연습문제 

 

(1) 파이썬의 클래스와 객체 지향 프로그래밍에 대한 설명으로 틀린 것은?

    ① 클래스에서 상속은 부모 클래스로부터 속성과 메서드를 물려받은 자식 클래스를 생성하는것을 말한다.

    ② 클래스에서 __init_ _( ) 함수는 객체 초기화 예약 함수이다.

    ③ 객체 지향 프로그래밍에서 속성은 값(variable)으로, 행동은 메서드(method)로 표현된다.

    ④ 클래스에서 함수(function) 추가는 기존 함수의 사용법과 동일하다.

    ⑤ 다형성은 같은 이름의 메서드의 내부 로직을 다르게 작성하는 것을 말하며,

        같은 부모 클래스를 상속하는 과정에서 주로 발생한다.

답 : ②

 

(2) 다음 코드의 실행 결과를 쓰시오.

class Person(object):
    def __init__(self, name):
        self.name = name
    def language(self):
        pass

class Earthling(Person):
    def language(self, language):
        return language

class Groot(Person):
    def language(self, language):
        return "I'm Groot!"
    name = ['Gachon', 'Dr.Strange', 'Groot']
    country = ['Korea', 'USA', 'Galaxy']
    language = ['Korean', 'English', 'Groot']
    for idx, name in enumerate(name):
        if country[idx].upper() != 'GALAXY':
            person = Earthling(name)
            print(person.language(language[idx]))
        else:
            groot = Groot(name)
            print(groot.language(language[idx]))

답 : 

(풀이)

 

(3) 다음과 같은 2개의 파일이 있다. ‘main.py’를 실행하였을 때 나오는 결과로 알맞은 것은?

    ※ factorial_calculator.py

def factorial(n):
    if n == 0:
        return 1
    else:
        return ( n * factorial(n-1))

    ※ main.py

from factorial_calculator import factorial
print(factorial_calculator.factorial(6))

➀NameError      ➁ None       ➂ 120       ➃ 720       ➄TypeError

답 : ④ 720

 

(4) 다음 코드의 실행 결과를 쓰시오.

class SoccerPlayer(object):
    def  __init__(self, name, position, back_number):
        self.name = name
        self.position = position
        self.back_number = back_number
    def  change_back_number(self, back_number):
        self.back_number = back_number

jinhyun = SoccerPlayer("jinhyun", "MF", 10)
print("현재 선수의 등번호는:",jinhyun.back_number)
jinhyun.change_back_number(5)
print("현재 선수의 등번호는:", jinhyun.back_number)

답 : 

현재 선수의 등번호는:10
현재 선수의 등번호는:5

 

(5) 다음 코드의 실행 결과를 쓰시오

class Marvel(object):
    def __init__(self, name, characteristic):
        self.name = name
        self.characteristic = characteristic
    def __str__(self):
        return "My name is {0} and my weapon is {1}.".format(self.name, self.characteristic)

class Villain(Marvel):
    pass

first_villain = Villain("Thanos", "infinity gauntlet")
print(first_villain)

답 : 

 My name is Thanos and my weapon is infinity gauntlet

 

(6) 제시된 코드를 참고하여 출력 결과를 차례대로 쓰시오.

class TV(object):
    def __init__(self, size, year, company):
        self.size = size
        self.year = year
        self.company = company
    def describe(self):
        print(self.company + "에서 만든 " + self.year + "년형 " + self.size + "인치" + "TV")

class Laptop(TV):
    def describe(self):
        print(self.company + "에서 만든 " + self.year + "년형 " + self.size + "인치 " + "노트북")


LG_TV = TV("32", "2019", "LG")
LG_TV.describe()
samsung_microwave = Laptop("15" , "2018", "Samsung")
samsung_microwave.describe()

답 : 

LG에서 만든 2019년형 32인치TV
Samsung에서 만든 2018년형 15인치 노트북

(풀이)

 

 

(7) 다음 코드의 실행 결과를 쓰시오.

class Score:
    def __init__(self,student):
        tmp = student.split(",")
        self.name = tmp[0]
        self.midterm = int(tmp[1])
        self.final = int(tmp[2])
        self.assignment = int(tmp[3])
        self.score = None
        self.grade = None
    def total_score(self):
        test_score = ((self.midterm + self.final)/2)*0.8
        if self.assignment>=3:
            assign_score = 20
        elif self.assignment>=2:
            assign_score = 10
        elif self.assignment>=1:
            assign_score = 5
        else:
            assign_score = 0
        self.score = test_score + assign_score
    def  total_grade(self):
        if self.assignment==0:
            grade = "F"
        elif self.score>=90:
            grade = "A"
        elif self.score>=70:
            grade = "B"
        elif self.score>=60:
            grade = "C"
        else:
            grade = "F"
        self.grade = grade
        return grade

student_john = Score("john,90,90,0")
aa = student_john.total_score()
bb = student_john.total_grade()
print(aa,bb,student_john.score,student_john.grade)

답 :

None F 72.0 F

(풀이)

student_john = Score("john,90,90,0") 일 경우,

(1) total_score() 는 return 이 없기 때문에 None 출력
(2) total_grade() 는 return 이 grage 이며 assignment 값에 따라 지정되므로 F 출력
    int(tmp[3]) = 0
    self.assignment = int(tmp[3])
    if self.assignment==0:
        grade = "F"
(3) score 는 test_score + assign_score 이고
    test_score 는 ((self.midterm + self.final)/2)*0.8 의 결과값인 72.0 가 된다. 
(4) grade 는 self.grade = None 이었다가 total_grade( ) 함수에서 self.grade = grade 로 다시 지정된다.
    if self.assignment==0:
        grade = "F"

 


15. 리눅스에 JDK 설치하기

 

   * 설치 관련 프로그램
      - rpm : 설치 또는 업그레이드를 지원 
      - yum : 설치 또는 제거를 지원 (rpm의 최신 확장판이라고 볼 수 있음)
      - rpm 를 이용하여 jbox를 설치하고자 하는 경우,
        (1) jbox는 jquery로 이루어져 있음
        (2) install jquery
        (3) install jbox
      - yum 을 이용하여 jbox를 설치하고자 하는 경우
        (1) jbox는 jquery로 이루어져 있음
        (2) install jbox (jquery가 필요하면 알아서 설치한다.)
            → 전체적인 설치과정이 용이하여 더 많이 사용하는 편이다. 

 

(1) root 계정으로 로그인 후 터미널에서 JAVA가 존재하는지 확인해볼 수 있다. 

[root@localhost ~]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

   → 현재 리눅스에 openjdk 1.8 버전이 존재하지만, 일부 환경에서는 openjdk를 지원하지 않는 경우가 있다.

       따라서 호환성 문제에 대비하기 위해 openjsk 삭제 후 oracle jdk를 설치하고자 한다. 

 

(2) rpm -qa 명령어를 사용하여 모든 패키지에 대해 자세한 내용을 출력할 수 있다. 

rpm -qa 
   RPM (RedHat Package Manager)
   레드햇 계열의 리눅스 배포판에서 사용하는 프로그램 (패키지) 설치 관리 도구
   윈도우의 setup.exe와 비슷하게 패키지를 자동으로 설치할 수 있도록 도와준다. 
   [참고]
    dololak.tistory.com/312

 

 

(3) 너무 상세하므로, 파이프 연산자로 추가 옵션을 주어 패키지가 이미 설치된 내역을 조회한다. 

rpm 옵션 | grep 패키지이름
[root@localhost ~]# rpm -qa | grep jdk
java-1.7.0-openjdk-headless-1.7.0.261-2.6.22.2.el7_8.x86_64
java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64
copy-jdk-configs-3.3-10.el7_5.noarch
java-1.8.0-openjdk-headless-1.8.0.262.b10-1.el7.x86_64
java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64

  → 현재 설치된 jdk 관련 패키지들을 확인할 수 있다. 

 

 

(4) 기존 자바 버전 삭제

[root@localhost ~]# yum remove java*

...
Transaction Summary
==========================================================
Remove  7 Packages (+32 Dependent packages)

Installed size: 222 M
Is this ok [y/N]: y

...
Complete!

 

(5) 자바가 삭제되었음을 확인할 수 있다. 

[root@localhost ~]# rpm -qa | grep jdk
copy-jdk-configs-3.3-10.el7_5.noarch

  → java 로 시작하지 않는 파일 하나만 남아있다. 

[root@localhost ~]# java -version
bash: /usr/bin/java: 그런 파일이나 디렉터리가 없습니다

 

(6) 파이어폭스로 오라클 홈페이지에 접속하여 JDK 8버전을 다운 받는다. 

(1) www.oracle.com 접속
(2) Product - Java - Download Java
(3) Java SE 8 - JDK Download
(4) Linux x64 Compressed Archive 에 있는 jdk-8u271-linux-x64.tar.gz 파일을 다운로드

 

(7) 탐색기를 통해 다운로드 디렉토리로 이동하면 다운 받은 파일을 확인할 수 있다. 

     다운 받은 파일을 / home/ centos 디렉토리로 복사한다.

 

(8) 터미널에서 작업경로를 / home / centos 로 이동 후 tar 파일의 압축을 푼다. 

[centos@localhost ~]$ tar fxvz jdk-8u271-linux-x64.tar.gz 
tar    tar 혹은 tar.gz파일의 압축을 풀기
-f    파일 이름을 지정
-x    tar 압축을 풂
-v    묶거나 파일을 풀 때 과정을 화면으로 출력
-z    gzip으로 압축하거나 해제함

 

(9) ls 명령어로 압축이 잘 풀렸는지 확인할 수 있다. 

[centos@localhost ~]$ ls
abc                           jdk1.8.0_271   temp   다운로드   바탕화면   사진   음악
jdk-8u271-linux-x64.tar.gz    test           공개   문서       비디오     서식

 

(10) 리눅스에서는 압축을 해제하는 것만으로도 패키지 설치가 완료된다. 

      jdk1.8.0_271 디렉토리 내부 목록을 출력하여 설치 내역을 확인해 볼 수 있다. 

[root@localhost centos]# ls jdk1.8.0_271
COPYRIGHT                           bin             legal
LICENSE                             include         lib
README.html                         javafx-src.zip  man
THIRDPARTYLICENSEREADME-JAVAFX.txt  jmc.txt         release
THIRDPARTYLICENSEREADME.txt         jre             src.zip
[root@localhost centos]# ls jdk1.8.0_271/bin
ControlPanel  javac           jconsole  jps         native2ascii  serialver
appletviewer  javadoc         jcontrol  jrunscript  orbd          servertool
extcheck      javafxpackager  jdb       jsadebugd   pack200       tnameserv
idlj          javah           jdeps     jstack      policytool    unpack200
jar           javap           jhat      jstat       rmic          wsgen
jarsigner     javapackager    jinfo     jstatd      rmid          wsimport
java          javaws          jjs       jvisualvm   rmiregistry   xjc
java-rmi.cgi  jcmd            jmap      keytool     schemagen

※ 윈도우에서 설치했던 oracle과 비슷한 구조로 설치되어 있다. 

 

(11) jdk가 설치되어 있는 폴더명을 mv 명령어를 사용하여 jdk1.8로 수정한다. 

[root@localhost centos]# mv jdk1.8.0_271/ jdk1.8

 

(12) gedit로 /etc/profile 파일을 연다. 

[root@localhost centos]# gedit /etc/profile

 

(13) profile 아래쪽에 자바 환경변수 설정을 추가 작성해준다. 

# 자바 환경변수 설정
export JAVA_HOME=/home/centos/jdk1.8
export JAVA_OPTS=-Dfile.encoding=UTF-8
export classpath="."

export PATH=$JAVA_HOME/bin:$PATH

※ -Dfile.encoding=UTF-8 은 언어 설정에 관한 옵션이다. 

※ classpath는 현재 디렉토리를 지정해주므로 . 을 기술한다. 

※ PATH 설정시 새롭게 추가된 $JAVA_HOME/bin 외에 기존의 환경변수도 PATH로 추가하기 위해 :$PATH 를 기술한다. 

※ java에서 ; 의 역할에 해당하는 문법이 : 이다. 

 

※ 리눅스에서 환경설정하는 파일은 4가지가 있다. 

   : 4가지 파일에 모두 환경변수를 적용하면 충돌하지 않고 우선순위대로 적용된다. 

     파일 위치   적용되는 계정   우선순위
     /etc/profile   root 계정 ( 모든 계정에 적용)   0
     /etc/bashrc   root 계정 (모든 계정에 적용)   1
     ~/.bashrc   해당 계정 사용자에 적용   2
     ~/.bash_profile   해당 계정 사용자에 적용   3

 

 

(11) profile 의 변경 사항이 적용되도록 source 명령어를 사용한다. 

      입력 후 아무것도 안 뜨면 잘 적용된 것이다. 

[root@localhost centos]# source /etc/profile

 

(12) 리부트 후 root 계정으로 다시 접속한다. 

[root@localhost centos]# reboot

 

(13) java의 버전을 확인하면 oepenjsk가 아니라 java 가 설치되어 있음을 확인할 수 있다. 

[root@localhost centos]# cd ~
[root@localhost ~]# java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)

 

(14) / home / centos 디렉토리로 이동 후 myjava 라는 이름의 디렉토리를 생성한다. 

[root@localhost ~]# cd /home/centos
[root@localhost centos]# mkdir myjava

 

(15) myjava 디렉토리로 작업경로를 이동한 뒤, 현재 위치를 확인해준다. 

[root@localhost centos]# cd myjava
[root@localhost myjava]# pwd
/home/centos/myjava

 

(16) gedit 사용하여 Test.java 파일을 생성한다. 

[root@localhost myjava]# gedit Test.java

 

(17) 실행시 "Hello World" 라고 출력하는 java 파일을 작성한다. 

public class Test{
    public static void main(String [] args){
        System.out.println("Hello World");
}

 

(18) ll 명령어를 사용하여 myjava 디렉토리에 방금 작성한 java 파일이 생성되었는지 확인한다.

[root@localhost myjava]# ll
합계 4
-rw-r--r--. 1 root root 132  1월 12 16:27 Test.java

 

(19) java 는 컴파일 언어이기 때문에 class 파일로 실행할 수 있다. 

     따라서, 자바 컴파일러를 사용하여 class 파일을 생성해준다.

     (정상적으로 수행되었을 경우 아무런 메세지가 나타나지 않는다.)

[root@localhost myjava]# javac Test.java

 

(20) ll 명령어를 사용하여 class 파일이 생성되었음을 확인할 수 있다. 

[root@localhost myjava]# ll
합계 8
-rw-r--r--. 1 root root 413  1월 12 16:31 Test.class
-rw-r--r--. 1 root root 132  1월 12 16:27 Test.java

 

(21) java 명령어로 class 파일을 실행하면 파일에서 작성한대로 출력된다.  

      class 파일 실행시엔 확장자명을 붙이지 않는다. 

[root@localhost myjava]# java Test
Hello world

 

(22) 실행 시 정상 작동(Hello World 출력)했으면 java 가 설치가 완료된다. 

 


16. 리눅스에 Tomcat 설치하기

 

(1) archive.apache.org/dist/tomcat/ 에 접속한다.

 

(2) 목록에서 tomcat-9/ 를 클릭한다. 

 

(3) 목록에서 v9.0.39/ 를 클릭한다. 

 

(4) 목록에서 bin/ 을 클릭한다. 

 

(5) 압축파일명을 클릭하면 다운로드가 시작되는 페이지에 접속했으므로 주소 전체를 복사한다. 

https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.39/bin/

 

(6) wget 을 사용하여 다운 및 설치할 예정이기 때문에 터미널에서 yum 을 통해 wget 을 먼저 install 해준다. 

    (현재 wget이 이미 설치된 상태라고 나온다. )

[root@localhost centos]# yum install wget
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
 * extras: mirror.kakao.com
 * updates: mirror.kakao.com
base                                                  | 3.6 kB     00:00     
extras                                                | 2.9 kB     00:00     
updates                                               | 2.9 kB     00:00     
Package wget-1.14-18.el7_6.1.x86_64 already installed and latest version
Nothing to do

 

(7) wget 명령어 이후에 복사한 주소 및 다운 받을 압축파일명을 기술하여 Tomcat을 설치한다. 

[root@localhost centos]# wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.39/bin/apache-tomcat-9.0.39.tar.gz  

 

(8) ll 명령어를 사용해보면 디렉토리 내에 이미 Tomcat 이 설치되어 디렉토리가 존재함을 확인할 수 있다. 

[root@localhost centos]# ls
abc                          jdk1.8  공개      비디오
apache-tomcat-9.0.39         myjava  다운로드  사진
apache-tomcat-9.0.39.tar.gz  test    문서      서식
jdk-8u271-linux-x64.tar.gz   temp    바탕화면  음악

 

(9) mv 명령어를 사용하여 apache-tomcat-9.0.39 디렉토리 이름을 tomcat9 로 변경한다. 

[root@localhost centos]# mv apache-tomcat-9.0.39 tomcat9
[root@localhost centos]# ls
abc                          jdk1.8  tmp      다운로드  비디오  음악
apache-tomcat-9.0.39.tar.gz  myjava  tomcat9  문서      사진
jdk-8u271-linux-x64.tar.gz   test    공개      바탕화면  서식

 

(10) 작업경로를 tomcat9 로 이동 후 ls 명령어로 디렉토리 내 구조를 확인한다. 

[root@localhost tomcat9]# ls
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs  webapps
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   temp  work

 

(11) 작업경로를 bin 으로 이동 후 ls 명령어로 디렉토리 내 구조를 확인했을 때 startup.sh 파일이 존재해야 한다. 

[root@localhost tomcat9]# cd bin
[root@localhost bin]# ls
bootstrap.jar                 configtest.sh     shutdown.sh
catalina-tasks.xml            daemon.sh         startup.bat
catalina.bat                  digest.bat        startup.sh
catalina.sh                   digest.sh         tomcat-juli.jar
ciphers.bat                   makebase.bat      tomcat-native.tar.gz
ciphers.sh                    makebase.sh       tool-wrapper.bat
commons-daemon-native.tar.gz  setclasspath.bat  tool-wrapper.sh
commons-daemon.jar            setclasspath.sh   version.bat
configtest.bat                shutdown.bat      version.sh

 

(12) . / startup.sh 로 현재 디렉토리에 있는 tomcat을 실행할 수 있다. (현재 디렉토리까지 표시해줘야 한다)

[root@localhost bin]# ./startup.sh
Using CATALINA_BASE:   /home/centos/tomcat9
Using CATALINA_HOME:   /home/centos/tomcat9
Using CATALINA_TMPDIR: /home/centos/tomcat9/temp
Using JRE_HOME:        /home/centos/jdk1.8
Using CLASSPATH:       /home/centos/tomcat9/bin/bootstrap.jar:/home/centos/tomcat9/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.

 

(13) 리눅스에서 파이어폭스 실행 후 주소창에 ip 주소와 포트 번호를 입력했을 때

      탐캣의 index 페이지가 출력되면 정상적응로 탐캣이 실행된 상태이다. 

http://127.0.0.1:8080
   * 127.0.0.1 이란?
    : PC에서 웹 서버를 띄운 뒤, 그 자신의 서버로 접속하게 해주는 예약된 IP 주소이다. 
      인터넷 상에 일반IP로는 쓰일 수 없는 주소이며, 
      OS에서 가상으로 지원하기 때문에, 랜카드 등의 디바이스를 통과하지 않고 소프트웨어적으로 처리된다. 
    : http://localhost:8080 라고 입력해도 같은 결과가 출력된다. 
    [참고]
    suzxc2468.tistory.com/178

 

 


17. 리눅스에서 war 파일로 스프링 프로젝트 페이지 접속하기

 

(1) ifconfig 명령어로 IP 주소를 확인할 수 있으나 너무 복잡하므로 대신 host에 대한 모든 IP주소를 출력하는 hostname -I 명령어를 사용한다.

[root@localhost bin]# hostname -I
192.168.159.129 192.168.122.1 

 

(2) IP 주소가 2개 출력되는데 이 중 전자가 리눅스의 IP 주소이다.

 

(3) 리눅스의 IP 주소를 복사하여 파이어폭스의 127.0.0.1 대신 입력했을 때

     탐캣 index 페이지가 정상적으로 출력되는지 확인한다. 

http://192.168.159.129:8080

 

(4) 리눅스에서 웹 서버를 띄웠기 때문에 윈도우에서도 동일한 IP 주소를 입력했을 때 접속이 되어야 하지만 

    접속이 되지 않는다. 

 

(5) 윈도우의 CMD 를 실행 후 system32 폴더로 이동한다. 

Microsoft Windows [Version 10.0.19041.685]
(c) 2020 Microsoft Corporation. All rights reserved.

C:\Users\kosmo_03>cd c:\windows\system32

 

(6) netstat 명령어에 포트넘버를 같이 보여주는 옵션 -n을 추가하여 입력하여 네트워크의 연결상태를 확인한다. 

   ※ netstat - 네트워크 접속, 라우팅 테이블, 네트워크 인터페이스의 통계 정보를 보여주는 명령어
c:\Windows\System32>netstat -n

활성 연결

  프로토콜  로컬 주소              외부 주소              상태
  TCP    127.0.0.1:1521         127.0.0.1:49676        ESTABLISHED
  TCP    127.0.0.1:49676        127.0.0.1:1521         ESTABLISHED
  
  ...
     로컬 주소 : 윈도우의 주소       
                                           외부 주소 : 리눅스의 주소

 

 

(7) 리눅스의 터미널에서 8080 포트의 방화벽을 영구 해제한다. 

    * 리눅스는 보안을 중요시 하는 운영체제이기 때문에 외부에서 접속을 하려면

       TCP 프로토콜로 들어오는 8080 포트를 반드시 열어줘야 한다. 

    * 영구 해제 옵션은 일반적으로 사용하지 않으나 현재는 실습중이라 편의성을 위해 permanent로 적용했다. 

[root@localhost tomcat9]# firewall-cmd --permanent --add-port=8080/tcp 
success

 

(8) 방화벽을 다시 불러와서 성공했는지 확인한다. 

[root@localhost tomcat9]# firewall-cmd --reload 
success

 

(9) 리눅스의 파이어폭스 주소창에 리눅스 서버의 IP를 입력했을 때 탐캣 index 페이지에 접속된다. 

    또한 윈도우의 크롬에서도 주소창에 리눅스 서버의 IP를 입력했을 때 탐캣 index 페이지에 접속할 수 있다. 

 

(10) tomcat9/webapps/ROOT 디렉토리 내에 index.jsp 가 존재하기 때문에

      파이어폭스에서 탐캣 index 페이지 접속할 수 있다. 

[root@localhost tomcat9]# ls webapps/ROOT
RELEASE-NOTES.txt  bg-button.png  bg-upper.png  tomcat-power.gif  tomcat.png
WEB-INF            bg-middle.png  favicon.ico   tomcat.css        tomcat.svg
asf-logo-wide.svg  bg-nav.png     index.jsp     tomcat.gif

 

(11) 새롭게 index.jsp 파일을 만들기 전에 기존의 index.jsp 파일 이름을 변경한다.

 

[root@localhost tomcat9]# mv webapps/ROOT/index.jsp webapps/ROOT/home.jsp

 

(12) 파일명이 home.jsp로 수정되었는지 확인한다. 

[root@localhost tomcat9]# ls webapps/ROOT
RELEASE-NOTES.txt  bg-button.png  bg-upper.png  tomcat-power.gif  tomcat.png 
WEB-INF            bg-middle.png  favicon.ico   tomcat.css        tomcat.svg
asf-logo-wide.svg  bg-nav.png     home.jsp      tomcat.gif        

 

(13) gedit 편집기를 사용하여 index.jsp 파일을 생성 후 화면에 출력될 내용을 작성한다. 

[root@localhost tomcat9]# gedit webapps/ROOT/index.jsp

 

<html>
<head>
	<title> First Page </title>
</head>
<body>
WELCOME ~
</body>
</html>

 

(14) 리눅스의 파이어폭스에서 리눅스의 서버 주소인 http://192.168.159.129:8080/ 로 접속시

      새로 작성한 index.jsp 페이지가 정상적으로 나오는지 확인한다. 

 

(15) 스프링에서 Mypro 라는 이름의 새 프로젝트를 만들되, Spring Legacy Project 로 생성한다. 

 

(16) src / webapps 폴더에 index.jsp 파일을 생성 후 화면에 출력될 내용을 작성, 저장한다. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title> 우리조 프로젝트 </title>
</head>
<body>
열심히 잘 만들어서 구축하고 운영합니다. 
</body>
</html>

 

(17) 프로젝트명 우클릭 - Export - Web - WAR file 선택 후 Next - 

      Browse... 클릭 - 저장할 위치 선택 후 확인 - Finish

      ★ WAR 파일은 프로젝트를 하나의 파일로 배포할 때 사용하는 압축파일이다. 

       * JAVA에서 jar 파일을 사용했던 것처럼 웹에서는 war 파일을 사용한다. 

 

(18) 생성된 WAR 파일 mypro.war 를 리눅스의 탐색기에서 home/centos/tomcat9/webapps 안에 붙여넣는다.

      webapps 폴더에서 자동으로 압축을 풀어준다. 

 

(19) 리눅스의 파이어폭스에서 주소창에 http://192.168.159.129:8080/mypro 입력시

      war 파일로 붙여넣은 페이지에 접속할 수 있다. 

 

 


18. 리눅스에서 오라클 설치하기 

 

 

(1) Oracle Database 11g XE 를 다운받기 위해

    리눅스의 파이어폭스에서 www.oracle.com  접속 후 product 에서 oracle Database 클릭

    ( XE 버전은 기존의 윈도우에서 사용하던 것보다 가벼운 버전이다. )

 

(2) Download Oracle Database 19c 클릭 -

    페이지 하단의 Oracle Database Express Edition 에서

    Oracle Database 11g Release 2 Express Edition for Linux x86 and Windows 클릭

 

(3) Oracle Database 11gR2 Express Edition for Linux x64 클릭

    - 오라클 로그인 후 다운로드 - 리눅스 탐색기에서 다운로드 디렉토리에 파일이 있음을 확인할 수 있다. 

 

(4) 리눅스 다운로드 디렉토리에서 다운받은 oracle 압축파일 우클릭 - 압축관리자 열기 - 창 좌측의 풀기 클릭

     - 창 우측의 풀기 클릭 - 닫기 - Disk1 이라는 디렉토리가 생성됨 - Disk1 복사

 

(5) usr / local 디렉토리 에서 새 폴더 생성 (oracle 이라는 이름으로) - Disk1 붙여넣기

 

(6) 리눅스의 터미널에서 현재 경로를 / user / local / oracle / Disk1 디렉토리로 이동 후 

     디렉토리 내부에 어떤 파일이 들어있는지 확인한다. 

     응용 프로그램을 설치할 수 있는 . rpm 파일이 들어있음을 알 수 있다. 

[root@localhost tomcat9]# cd /usr/local/oracle/Disk1
[root@localhost Disk1]# pwd
/usr/local/oracle/Disk1
[root@localhost Disk1]# ls
oracle-xe-11.2.0-1.0.x86_64.rpm  response  upgrade

 

(7) rpm 명령어를 -ivh 옵션과 함께 입력하면 oracle 11g xe 의 설치가 시작된다. 

   -i : 패키지 이름/ 버전 / 설명 등의 정보 출력
   -v : 패키지 메시지 출력
   -h : 패키지 설치할 때 #[해시마크] 출력 
[root@localhost Disk1]# rpm -ivh oracle-xe-11.2.0-1.0.x86_64.rpm 
준비 중...                         ################################# [100%]
/var/tmp/rpm-tmp.HUpVTQ: line 257: [: 18446744073692774399: integer expression expected
/var/tmp/rpm-tmp.HUpVTQ: line 271: [: 18446744073692774399: integer expression expected
Updating / installing...
   1:oracle-xe-11.2.0-1.0             ################################# [100%]
Executing post-install steps...
You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database.

 

(8) oracle 설치가 완료되면서 하단에 데이터베이스 구성을 위해

    /etc/init.d/oracle-xe configure 명령어를 root 계정에서 입력하라는 안내문이 출력된다. 

You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database. 

 

(9) 안내문에 출력된 명령어를 입력하면 오라클 사용시 기본적으로 8080 HTTP 포트번호 사용한다고 출력된다. 

[root@localhost Disk1]# /etc/init.d/oracle-xe configure

Oracle Database 11g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 11g Express 
Edition.  The following questions will determine whether the database should 
be starting upon system boot, the ports it will use, and the passwords that 
will be used for database accounts.  Press <Enter> to accept the defaults. 
Ctrl-C will abort.

Specify the HTTP port that will be used for Oracle Application Express [8080]:

 

(10) 현재 리눅스 상의 8080 포트를 탐캣에서 사용중이므로 엔터를 치는 대신 8080 외의 다른 포트를 입력해준다. 

      ( 오라클에서 8080 포트를 사용하고 탐캣에서 다른 포트 번호를 사용하도록 해도 무방하다. 겹치지만 않으면 됨 ! )

      다음으로 데이터베이스 리스터에서 기본적으로 1521 포트번호를 사용한다고 출력된다. 

Specify the HTTP port that will be used for Oracle Application Express [8080]:8000

Specify a port that will be used for the database listener [1521]:

 

(11) 오라클 포트 번호는 1521 를 그대로 사용할 것이름로 엔터를 치거나 1521를 똑같이 입력한다. 

      다음으로 관리자(시스템) 비밀번호를 묻는다. 

      ( 관리자 user_name 은 자동으로 SYS 또는 SYSTEM 이 지정된다. )

Specify a port that will be used for the database listener [1521]:1521

Specify a password to be used for database accounts.  Note that the same
password will be used for SYS and SYSTEM.  Oracle recommends the use of 
different passwords for each database account.  This can be done after 
initial configuration:

 

(12) 관리자 비밀번호를 2번 입력해준다. 입력시 화면에 표시되지 않는다. 

      다음으로 부팅할 때 오라클 데이터베이스를 실행할지 묻는다. 

initial configuration:
Confirm the password:

Do you want Oracle Database 11g Express Edition to be started on boot (y/n) [y]:

 

(13) 부팅할 때 오라클 데이터베이스를 실행하기 위해 y 입력 후 엔터를 치면

      데이터베이스를 구성을 시작하고, 이 때 시간이 다소 소요된다. 

Do you want Oracle Database 11g Express Edition to be started on boot (y/n) [y]:y

Starting Oracle Net Listener...Done
Configuring database...Specify a port that will be used for the database listener [1521]:1521

Specify a password to be used for database accounts.  Note that the same
password will be used for SYS and SYSTEM.  Oracle recommends the use of 
different passwords for each database account.  This can be done after 
initial configuration:
Done
Starting Oracle Database 11g Express Edition instance...Done
Installation completed successfully.

 

(14) 부팅시 실행하도록 설정했으나 현재는 리부트를 하지 않았으므로, 오라클을 수동으로 실행해야 한다. 

      / etc / init.d / 디렉토리에 위치한 oracle-xe 를 실행하는 명령어를 입력하면 시작했다고 메세지가 출력된다. 

[root@localhost Disk1]# /etc/init.d/oracle-xe start
Starting oracle-xe (via systemctl):                        [  OK  ]
 

 

(15) 오라클 사용을 위해 TCP 프로토콜로 들어오는 1521 포트 번호의 방화벽을 해제 후,

      방화벽을 다시 불러온다. 

[root@localhost Disk1]# firewall-cmd --permanent --add-port=1521/tcp
success
[root@localhost Disk1]# firewall-cmd --reload
success

 

(16) 오라클 환경변수 설정을 위해 오라클이 설치된 경로를 확인한다.

      u01 / app / oracle / product / 11.2.0 / xe 

 

(17) 모든 계정에서 적용할 수 있도록 환경변수를 설정하기 위해 gedit 를 사용하여 / etc / profile 을 연다. 

      ( 개인적으로 단독 사용할 것이기 때문에 profile 에 작성하지만, 업무용일 경우에는 profile 을 사용하지 않는다. )

[root@localhost Disk1]# gedit /etc/profile

 

(18) 오라클 환경변수 설정을 위한 내용을 작성한다. 

      * SID는 과거에는 orcl이었으나 현재 설치된 버전은 XE로 되어 있다. 
      * 수업동안 작성한 JAVA 등 다른 파일 상에는 SID가 orcl로 되어 있기 때문에 해당 파일을 리눅스에서 사용하려면

           1) 리눅스 환경변수 파일에서 orcl 로 수정하거나,

           2) JAVA 파일 상에서 orcl 을 xe로 수정해줘야 한다. 

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
export ORACLE_SID=XE
export PATH=$ORACLE_HOME/bin:$PATH

 

(19) 바뀐 설정파일의 내용을 적용하기 위해 source 명령어를 입력한다. 

[root@localhost Disk1]# source /etc/profile

 

(20) 시스템을 재시작 한 뒤, root 계정으로 다시 접속한다. 

[root@localhost Disk1]# reboot

 

(21) 오라클이 잘 설치되었는지 실행해보려면 sqlplus 명령어로 실행할 수 있다. 

      관리자 user_name 에는 자동 지정된 system 을, 

      관리자 비밀번호에는 (12) 에서 지정했던 비밀번호를 입력하면 오라클이 실행되었음을 확인할 수 있다. 

[root@localhost ~]# sqlplus

SQL*Plus: Release 11.2.0.2.0 Production on Tue Jan 12 17:54:44 2021

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Enter user-name: system
Enter password: 


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> SQL> 

 

(22) SQL 이 정상적으로 데이터를 불러올 수 있는지 SELECT 문을 입력하여 조회를 하고 결과를 출력할 수 있다. 

SQL> select * from tab;

 

(23) 오라클을 나가려면  quit 를, 터미널을 나가려면 exit 를 입력한다. 

 

 

[ 참고 ]

8000번은 오라클 응용프로그램이 사용하는 포트라서 우리가 열어주는 포트가 아님, 방화벽을 풀 필요가 없음.

1521만 열어주면 됨

 

반응형

'교육과정 > KOSMO' 카테고리의 다른 글

Day65  (0) 2021.01.14
Day64  (0) 2021.01.13
Day62  (0) 2021.01.11
Day61  (0) 2021.01.08
Day60  (0) 2021.01.07