Self Study

9-1 Code09-03.py를 수정해서 커피 종류를 아메리카노, 카페라떼, 카푸치노, 에스프레소 중 하나를 선택할 수 있도록 하자. 그리고 로제, 리사, 지수, 제니라는 손님 4명의 주문을 받아 보자.

출력 결과
로제씨, 어떤 커피 드릴까요?(1:아메리카노, 2:카페라떼, 3:카푸치노, 4:에스프레소) 4
#1. (자동으로) 뜨거운 물을 준비한다.
#2. (자동으로) 종이컵을 준비한다.
#3. (자동으로) 에스프레소를 탄다.
#4. (자동으로) 물을 붓는다.
#5. (자동으로) 스푼으로 젓는다.
로제씨~ 커피 여기 있습니다.
… 생략 …

 

더보기

답 :

## 전역 변수 선언 부분 ##
coffee = 0

## 함수 선언 부분 ##
def coffee_machine(button) :
    print()
    print("#1. (자동으로) 뜨거운 물을 준비한다.");
    print("#2. (자동으로) 종이컵을 준비한다.");

    if coffee == 1 :
        print("#3. (자동으로) 아메리카노를 탄다.")
    elif coffee == 2 :
        print("#3. (자동으로) 카페라떼를 탄다.")
    elif coffee == 3 :
        print("#3. (자동으로) 카푸치노를 탄다.")
    else :
        print("#3. (자동으로) 에스프레소를 탄다.")

    print("#4. (자동으로) 물을 붓는다.");
    print("#5. (자동으로) 스푼으로 젓는다.");
    print()
        
## 메인 코드 부분 ##
coffee = int(input("로제씨, 어떤 커피 드릴까요?(1:아메리카노, 2:카페라떼, 3:카푸치노, 4:에스프레소)"))
coffee_machine(coffee)
print("로제씨~ 커피 여기 있습니다.")

coffee = int(input("리사씨, 어떤 커피 드릴까요?(1:아메리카노, 2:카페라떼, 3:카푸치노, 4:에스프레소)"))
coffee_machine(coffee)
print("리사씨~ 커피 여기 있습니다.")

coffee = int(input("지수씨, 어떤 커피 드릴까요?(1:아메리카노, 2:카페라떼, 3:카푸치노, 4:에스프레소)"))
coffee_machine(coffee)
print("지수씨~ 커피 여기 있습니다.")

coffee = int(input("제니씨, 어떤 커피 드릴까요?(1:아메리카노, 2:카페라떼, 3:카푸치노, 4:에스프레소)"))
coffee_machine(coffee)
print("제니씨~ 커피 여기 있습니다.")

 

9-2 Code09-05.py에 다음 기능을 추가해 보자.

① 숫자1, 연산자, 숫자2 순서로 입력받는다.

② 제곱(**) 연산자를 추가한다.

③ 0으로 나누려고 하면 메시지를 출력하고 계산되지 않도록 한다.

 

힌트 메인 코드 부분에 if~else 문을 활용한다.

출력 결과
첫 번째 수를 입력하세요 : 2
계산을 입력하세요(+, -, *, /, **) : ** 
두 번째 수를 입력하세요 : 4
## 계산기 : 2 ** 4 = 16
출력 결과
첫 번째 수를 입력하세요 : 8
계산을 입력하세요(+, -, *, /, **) : /
두 번째 수를 입력하세요 : 0
0으로는 나누면 안 됩니다.ㅠㅠ

 

더보기

답 :

## 함수 선언 부분 ##
def calc(v1, v2, op) :
    result = 0
    if op == '+' :
        result = v1 + v2
    elif op == '-' :
        result = v1 + v2
    elif op == '*' :
        result = v1 * v2
    elif op == '/' :
        result = v1 / v2
    elif op == '**' :
        result = v1 ** v2

    return result

## 전역 변수 선언 부분 ##
res = 0
var1, var2, oper = 0, 0, ""

## 메인 코드 부분 ##
var1 = int(input("첫 번째 수를 입력하세요 : "))
oper = input("계산을 입력하세요(+, -, *, /, **) : ")
var2 = int(input("두 번째 수를 입력하세요 : "))

if var2 == 0 :
    print("0으로는 나누면 안 됩니다.ㅠㅠ")

res = calc(var1, var2, oper)

print("## 계산기 : %d %s %d = %d"%(var1, oper, var2, res))

 

9-3 Code09-11.py에서 2에서 10개까지 몇 개를 매개변수로 사용하든지 합계를 구하도록 para_func() 함수를 수정해 보자.

출력 결과
매개변수가 2개인 함수를 호출한 결과 ==> 30

매개변수가 10개인 함수를 호출한 결과 ==> 550

 

더보기

답 :

## 함수 선언 부분 ##
def para_func(v1, v2, v3 = 0, v4 = 0, v5 = 0, v6 = 0, v7 = 0, v8 = 0, v9 = 0, v10 = 0) :
    result = 0
    result = v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10
    return result

## 전역 변수 선언 부분 ##
hap = 0

## 메인 코드 부분 ##
hap = para_func(10, 20)
print("매개변수가 2개인 함수를 호출한 결과 ==> %d" % hap)
hap = para_func(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
print("매개변수가 10개인 함수를 호출한 결과 ==> %d" % hap)

 

연습문제

1. 다음 함수의 설명 중, 거리가 먼 것을 모두 고르세요.

① 함수는 뒤에 함수명( ) 처럼 뒤에 괄호 또는 함수명[ ] 처럼 뒤에 대괄호가 붙는다.

② print("값") 처럼 괄호 안에 데이터를 전달할 수 있다.

③ 파이썬은 자체 함수는 제공하지 않지만, 필요시 사용자가 직접 만들어서 사용할 수 있다.

④ 함수의 사용을 위해서 내부 작동을 꼭 알아야 할 필요는 없다. 함수에 전달하는 값과 어떤 작동만 하는지 정도만 알면 함수의 사용에는 문제가 없다.

 

더보기

답 : 1, 3

해설 : 1번 함수명[ ] 처럼 대괄호가 붙는 것은 리스트나 배열이다. 3번 파이썬은 자체 함수를 제공하고 있다.

 

2. 다음 빈칸에 들어갈 것을 쓰세요.

함수는 [      ①     ]를 입력받은 후에, 그 [     ①     ]를 가공해서 [      ②     ]을 돌려줍니다. 커피 자판기의 예를 들면 동전 및 버튼 입력이 [      ①     ]이고, 그 결과 나오는 커피가 [     ②     ]입니다.

 

더보기

답 : ① 매개변수     ② 반환값

 

3. 다음 코드에서 빈칸을 채우세요.

def plus(     ①     ) :
	result = 0
    result = v1 + v2 + v3
    [     ②     ]
    
   hap = plus(100, 200, 300)
   print(hap)

 

더보기

답 : ① v1, v2, v3     ② return result

 

4. 다음에서 출력되는 값을 예상해 보세요.

def f1() :
    print(var)

    
def f2() :
    var = 10
    print(var)

    
var = 100
f1()
f2()

 

더보기

답 : 100, 10

 

5. 함수의 반환값에 관련된 내용입니다. 거리가 먼 것을 모두 고르세요.

① 반환값은 반드시 1개 이상 있어야 한다.

② 반환값은 2개일 수도 있다.

③ 반환값이 2개일 경우, 두 반환값의 형식은 동일해야 한다.

④ 반환값이 3개일 경우, 내부적으로 리스트로 묶여서 반환된다.

⑤ 반환값의 개수와 매개변수의 개수는 연관이 없다.

 

더보기

답 : 1, 4

해설 : 1번 반환값을 가지지 않을 수도 있다. 4번 튜플이나 여러 개의 변수로 개별적으로 반환될 수 있다.

 

6. pass 예약어의 의미를 가장 잘 설명한 것을 고르세요.

① 동일한 내용을 반복한다는 의미이다.

② 이후의 코드를 모두 건너뛴다는 의미이다.

③ 그냥 아무것도 하지 않고 비워 놓을 때 사용한다.

④ if 문에서만 사용한다.

 

더보기

답 : 3

 

7. 함수의 매개변수와 관련된 설명입니다. 거리가 먼 것을 모두 고르세요.

① 매개변수는 1개 이상은 있어야 한다.

② 매개변수는 2개일 수도 있다.

③ 매개변수가 2개일 경우, 두 매개변수의 형식은 동일해야 한다.

④ 매개변수가 2개 이상일 경우, 반환값도 2개 이상이어야 한다.

매개변수는 이름만 다르면 개수가 많아도 상관없다.

 

더보기

답 : 1, 3, 4, 5

해설 : 1번 매개변수를 가지지 않을 수도 있다. 3번 매개변수는 각각 독립적으로 자신의 형식을 가질 수 있다. 4번 매개변수의 개수와 반환값의 개수는 연관 없다. 반환값이 없을 수도, 하나일 수도 있다. 5번 매개변수의 이름과 개수가 일치하지 않으면 오류가 발생한다.

 

8. 다음은 3개의 매개변수 중 기본값을 2개 설정하는 코드입니다. 빈칸을 채우세요.

*메일 문의 결과 기본값 2개가 아니라 3개가 맞다고 합니다.

실행 결과
매개변수 없이 호출 ==> 6
매개변수가 1개로 호출 ==> 6
매개변수가 2개로 호출 ==> 6
매개변수가 3개로 호출 ==> 6
def myFunc(     ):
    ret = p1 + p2 + p3
    return ret

print("매개변수 없이 호출 ==> ", myFunc())
print("매개변수가 1개로 호출 ==> ", myFunc(1))
print("매개변수가 2개로 호출 ==> ", myFunc(1, 2))
print("매개변수가 3개로 호출 ==> ", myFunc(1, 2, 3))

 

더보기

답 : p1 = 1, p2 = 2, p3 = 3

 

9. 다음은 모듈 및 패키지에 대한 설명입니다. 거리가 먼 것을 모두 고르세요.

① 모듈은 함수들의 집합으로 볼 수 있다.

② 파이썬은 자체 모듈을 제공하지 않지만, 필요하면 직접 모듈을 만들어서 사용할 수 있다.

③ mod.py 파일을 임포트하려면 import mod 문을 사용하면 된다.

④ 모듈 안의 함수를 호출할 때는 '모듈명[함수명]' 형식을 사용한다.

패키지는 모듈을 모아 놓은 것으로 파일의 형태로 제공된다.

⑥ 패키지는 주로 'from 패키지명. 모듈명 import 함수명'을 사용한다.

 

더보기

답 : 2, 4

해설 : 2번 파이썬은 자체 모듈을 제공하고 있다. 4번 모듈 안의 함수를 호출할 때는 '모듈명.함수명'형식을 사용한다.

 

10. 다음 코드는 오류가 발생합니다. 오류가 발생하는 행을 고르고, 그 이유를 간단히 설명하세요.

def func1(v1,v2) :
    def func2(num1, num2) :
        return num1 + num2
    return func2(v1, v2)

print(func1(100, 200))
print(func2(100, 200))

 

더보기

답 : 7행 print(func2(100, 200)), fuc2 함수가 내부에서 정의되었기 때문이다.

해설 : func2 함수는 func1함수의 지역 범위에만 존재한다. func2 함수를 사용하려면 func1 함수 내에서 호출하거나 전역으로 정의해야한다.

 

11. 1부터 100까지의 합계(=5050)을 구하는 재귀 함수를 사용한 코드입니다. 재귀 함수의 빈칸을 완성하세요.

def addNumber(num) :
    
    
    
    
print(addNumber(100))

 

더보기

답 :

if num <= 1 :
    return num
else :
    return num + addNumber(num-1)

 

12. 재귀 호출 함수를 이용해서 입력한 10진수를 2진수/8진수/16진수로 변환하는 코드를 작성하세요. 재귀 호출 함수는 2진수로 변환하는 base2(숫자), 8진수로 변환하는 base8(숫자), 16진수로 변환하는 base16(숫자) 등 3개 함수를 작성하세요.

실행 결과
10 진수 입력 -->

2진수 : 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
8진수 : 7 7 7 7 7
16진수 : 7 F F F

 

더보기

답 :

def base2(num):
    if num == 0:
        return ''
    else:
        return base2(num // 2) + str(num % 2)

def base8(num):
    if num == 0:
        return ''
    else:
        return base8(num // 8) + str(num % 8)

def base16(num):
    hex_chars = "0123456789ABCDEF"
    if num == 0:
        return ''
    else:
        return base16(num // 16) + hex_chars[num % 16]

dec = int(input("10진수 입력 --> "))

bin = base2(dec)
oct = base8(dec)
hex = base16(dec)

print("2진수: ", bin)
print("8진수: ", oct)
print("16진수: ", hex)

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

CRUD

Create 저장

Read 열람

Update 변경

Destroy 삭제

 

우리가 쓰는 모든 웹 서비스의 바탕이 CRUD로 이루어졌다 보아도 무관하다.

스프링부트(Springboot)는 MVC 구조(모델, 뷰, 컨트롤러)를 가지고 사용자의 요청을 받아서 컨트롤러가 전달한 뒤, 데이터베이스가 전달한 데이터를 기록할 수 있도록 구성되어있다.

스프링부트에서 우리가 설계한 모델을 데이터베이스에 어떤 식으로 적용하게 되는지 알아보자.

스프링부트와는 RDBMS라고 하는 관계형 데이터베이스를 주로 사용한다. 관계형 데이터베이스표 형식으로 데이터를 관리하는 데이터베이스로 행, 열로 구성되어있으며 각각의 attribute(속성)에 대한 값을 한줄한줄 객체로 기록해놓는다. 대부분의 시스템에서 사용하고 있으며 Sqlite, mySQL, Postgresql 등 다양한 종류의 RDBMS가 출시되었다.

 

Row(행) - 개별 객체

Column(열) - 항목(attributes, fields)Table - 표 전체. 데이터를 모아놓은 구조.

/ A B C D
1        
2        
3        
4        

 

운영환경에 레포트하는 어플리케이션은 취약점이나 보안이 노출될 수 있기 때문에 로그를 자세히 띄워주지 않는데 개발환경에서는 Debug로 설정하여 로그를 자세하게 볼 수 있도록 한다.

실제로 데이터베이스를 사용하는 것은 H2라는 데이터베이스를 사용한다. H2 베이스는 인메모리 방식으로 사용할 수 있는 빠른 데이터베이스이다. 상용에는 적합하지 않지만 개발에서는 활용할 수 있는 데이터베이스이다.

JPA는 스프링부트에서 데이터베이스와 연동을 하기 위한 중간 매개체이다.

h2 콘솔 enabled를 true로 준 이유는 브라우저를 통해 h2 콘솔에 접속하여 실제 데이터베이스가 어떻게 접속되었는지 확인해 볼 수 있다.

 

 

'Back-End > Java' 카테고리의 다른 글

Spring Boot  (0) 2023.05.26
IP와 Port 그리고 DNS  (0) 2023.05.25
쿠키와 세션  (0) 2023.05.23
HTTP 통신과 URL  (0) 2023.05.23
Web - 클라이언트와 서버  (0) 2023.05.22

Spring Boot 이전에 Spring은 Java 오픈소스 어플리케이션 프레임워크에서 출발했다.

엔터프라이즈급 어플리케이션을 정해진 규칙이나 설계에 따라 개발했을 때, 견고하고 안정적인 서비스가 개발 가능하다는 장점으로 많은 환영을 받았다. 그런데 기존 스프링은 웹 개발에 필요한 설정이 너무 복잡하고 일일이 메뉴얼을 추가하고 확인해야하는 문제가 있었다. 그래서 스프링의 하위 프로젝트로 웹 개발에 최적화된 Spring Boot라고 하는 프로젝트가 발표되었다.

 

Spring Boot는 웹 개발에 필요한 설정을 어노테이션(@) 등으로 간편하게 처리할 수 있게 되었다. 어노테이션을 사용하면 불필요하게 설정을 입력하는 반복작업을 줄일 수 있다. 각종 의존성은 스프링이 모두 도맡아서 관리하며 톰캣 웹 서버가 내장되어 있어 별도의 세팅이 불필요하다.

 

 

Spring Boot 프로젝트 생성

1. 프로젝트를 선택하고 언어와 버전을 선택한 뒤, 프로젝트 정보를 입력한다.

 

2. 디펜던시에서 Spring WEB, 데이터 베이스를 연동하기 위한 JPA, 우리가 사용할 H2 Database를 추가한 뒤, Generate를 누른다.

 

3. 압축을 풀어 IntelliJ에서 실행한다.

 

4. main - java에서 프로젝트를 실행하고 인터넷 주소창에 localhost:8080을 입력하여 접근한다.

아무 값도 설정하지 않았기 때문에 이것이 정상적인 화면이다.

 

 

'Back-End > Java' 카테고리의 다른 글

Spring Boot - CRUD  (0) 2023.05.29
IP와 Port 그리고 DNS  (0) 2023.05.25
쿠키와 세션  (0) 2023.05.23
HTTP 통신과 URL  (0) 2023.05.23
Web - 클라이언트와 서버  (0) 2023.05.22
네트워크

네트워크는 우리가 만들어나갈 웹서비스의 밑바탕이다. 두 대 이상의 컴퓨터가 연결된 통신망네트워크라고 한다. 인터넷에 꼭 접속되지 않더라도 내 컴퓨터와 다른 컴퓨터를 연결한 것 자체가 작은 네트워크를 구성한 것이라 볼 수 있다.

네트워크에서 중요한 것은 어떤 방식으로 어떻게 데이터가 오가는지 이해하는 것이 핵심이다. 구성된 네트워크에서 연결된 개별 컴퓨터를 호스트(host)라고 한다. 많은 컴퓨터를 하나의 네트워크망 안에 구성하기 위해서는 연결을 위한 매개체가 필요하다. 하나로 묶어주는 것을 스위치(switch)라고 한다. 동일한 네트워크에서 호스트 간의 통신을 가능하게 해준다. 그러나 다른 네트워크에는 접선할 수 없다. 그래서 라우터(router)가 등장했다. 네트워크를 구성하는 스위치의 기능을 포함하고 있으며 서로 다른 네트워크 간에 통신을 할 수 있도록 한다. 우리에게 친숙한 이름으로 공유기라고도 불린다. 그렇게 네트워크와 네트워크가 연결된 거대한 통신망을 인터넷(internet)이라고 한다. 

 

 

IP 주소

Internet Protocol

컴퓨터 간 데이터를 주고 받는 네트워크 계층의 규약

네트워크 계층의 규약에 따라 데이터 전달에 필요한 목적지 컴퓨터 정보가 반드시 필요하다.

송신자가 수신자에게 우편을 보내기 위해 우체국에 필요한 정보를 넘겨야한다. 이때 가장 중요한 정보는 수신자 주소이다. 송신자가 우체국에 정보를 전달하면, 우체국은 수신자 주소에 문제가 없다면 수신자에게 우편을 전달한다. 만약 수신자 주소를 잘못 전달한다면 우체국에서는 수신자에게 우편을 수신할 수 없게 되고 송신자에게 다시 반송한다.

컴퓨터가 다른 컴퓨터에 요청할 때에는 식별할 수 있는 고유한 주소를 가져야한다. 네트워크에서 컴퓨터가 부여받는 고유한 주소IP 주소라고 한다.

IP 주소에는 크게 두 가지 종류가 있다. IPv4 체계에서는 32bit의 용량을 가질 수 있다. 초창기 인터넷과는 달리 IT 서비스가 급성장을 하고 환경이 급변하게 되면서 전세계의 주소자원, IP 주소자원이 매우 부족해지게 됐다. 그래서 이를 대체할 수 있는 128bit의 IPv6가 나오게 된다. IPv6는 아직 자리잡기 못해 IPv4와 병행 중이다.

 

IP 주소의 구조(IPv4 기준)

IP 주소는 2진수로 이루어져있다. 실제 활용할 때는 10진수로 변환한 값을 활용한다.

2진수 IP를 8비트씩 분할하면 4개로 구성된다. 여기서 분할된 1byte(=8bit)는 옥텟(octet)이라고 한다. 즉, 4개의 옥텟으로 구성된다. 이 4개의 옥텟으로 분할된 각각의 값을 2진수에서 10진수로 변환한 다음, 마침표로 구분해주면 우리가 사용하는 IP 주소의 형태가 된다.

각 마디의 숫자는 0부터 255까지의 범위를 가지고 있다. 이 범위를 벗어난 숫자로 된 IP 주소는 잘못된 IP 주소이다.

 

공인 IP vs 사설 IP

일반적인 가정에서는 대부분 SK나 KT, LG U+ 등에서 제공하는 인터넷 서비스에 가입하여 사용한다. 이렇게 인터넷 서비스를 제공하는 업체를 ISP(Internet Service Provider)라고 한다. ISP는 우리가 사용하고 있는 공유기나 컴퓨터에 공인 IP를 할당한다. 공인 IP(Public IP)전체 인터넷 망에서 고유하게 식별 가능한 주소이다. 어떠한 컴퓨터, 모바일 환경에서든 인터넷이 연결된 환경에서는 IP가 동일한 곳을 가르킨다. 그러나 공인 IP가 전체 인터넷 망에서 사용되고 있기 때문에 IPv4 체계에서는 자원이 부족하다. 그래서 유효 자원수가 모자라서 IPv6가 등장했다.

우리가 사용하고 있는 컴퓨터는 공인 IP를 사용하고 있을까? 사실은 그렇지 않다. 일반적으로 인터넷이 연결된 컴퓨터는 공인 IP 대신 사설 IP를 할당받는다. 공인 IP를 할당받은 공유기에서 컴퓨터, 모바일 등 다양한 기기들에게 새로운 네트워크의 IP를 할당받는다. 그렇게 하면 공인 IP를 굳이 모든 장비가 받지 않아도 인터넷 환경에 접근할 수 있기 때문에 효율적으로 IPv4의 주소자원을 관리할 수 있게 된다. 즉, 하나의 공인 IP에서 수많은 사설 IP 할당이 가능하다.

사설 IP(Private IP)가정의 LAN과 같은 네트워크에서 할당되는 주소이다. 컴퓨터에서 조회하면 나오는 IP이다. 사설 IP가 인터넷 환경이 아니라 LAN과 같은 소규모 네트워크 환경에서 유효한 주소이기 때문에 외부와 통신할 때만 이 공유기에 할당된 공인 IP를 활용하기 때문에 내가 사용하고 있는 IP 주소를 명령어로 조회해보면 라우터에서 부여한 사설 IP가 조회된다. 즉, 내가 연결한 공유기 안에서만 유효하며 인터넷 환경에서 가르키는 IP 주소가 아니다.

내 컴퓨터가 외부에 빛춰지는 공인 IP는 네이버에 내 IP라고 검색하면 IP 주소를 조회할 수 있다. 실제로 내 PC에서 다른 외부 서버를 접근할 때, 제한되는 방화벽 등의 조건들을 해제할 때에는 반드시 공인 IP를 기준으로 등록해야 방화벽이 해제 또는 설정된다.

 

127.0.0.1(Localhost)

컴퓨터의 관점에서 자기자신을 가르키기 위해 약속된 IP 주소

특정 컴퓨터, 즉 내가 사용하는 내 컴퓨터에서만 유효한 이름이다. 이 네트워크 내역을 조회해보면 lo라는 이름으로 IP 127.0.0.1이 조회되는 것을 확인할 수 있다. lo는 Loopback Network Interface에서 비롯된 네트워크 명칭으로, 컴퓨터 관점에서 자기자신인 로컬호스트를 의미한다.

 

 

Port

하나의 컴퓨터에는 다양한 서비스가 실행 중이다.

컴퓨터를 특정할 수 있는 IP 주소만으로는 실행되고 있는 다양한 서비스 중에 어떤 곳에 데이터를 보내고 요청 해야하는지 알 수 없다. Port하나의 컴퓨터에서 실행되고 있는 다양한 어플리케이션 서비스를 구분하는 역할을 한다. 대표적으로 할당된 포트 번호 예시로는 HTTP(80), HTTPS(443), SMTP(25), FTP(21) 등이 있다. 웹서비스를 개발 할 때 다른 서버와 통신을 해야할 때가 있다. 접근하려는 목적지 IP와 Port를 정확하게 설정해야한다.

 

 

DNS

일반적으로 상용 서비스의 공인 IP는 보안 등의 이유로 공개되지 않는다. 우리가 사용하는 것은 문자열로 되어있는 주소이다. 그렇다면 알파벳으로 이루어진 URL로 어떻게 웹서버의 위치를 정확히 파악할 수 있는 것일까?

DNS(Domain Name Server)URL을 해석하여 IP 주소로 반환하는 역할을 하는 서버이다. 사용자가 주소창에 URL을 입력하면 먼저 DNS 서버로 가서 매칭되는 IP 주소가 있는지 찾는다. 이 DNS는 전세계에 분포 되어있으며 첫 번째로 탐색한 DNS 서버에 웹핑 정보가 없으면 다른 DNS 서버를 돌아다니며 주소를 찾게 된다. DNS 서버에서 URL과 맵핑된 IP 주소를 찾게 되면 이 IP 주소를 브라우저로 전달한다. 최종적으로 브라우저는 DNS로부터 전달받은 IP를 통해 홈페이지에 접속하게 된다. 즉, URL이나 IP 주소 모두 어떤 서버, 클라이언트(컴퓨터)의 위치를 특정하는 역할을 한다. 우리가 통상 사용하는 URL을 사용할 때, IP 주소로 반환해주는 역할을 하는 DNS 서버가 있다.DNS 서버는 전세계적으로 국가, 기업, 클라우드 사업자 등이 운영한다. URL에 대한 IP 주소를 반환하는 성능을 향상시키기 위해 여러가지 알고리즘이 활용되거나 하드웨어적인 개선을 하기도 한다. DNS 서버에 장애가 발생하면 막대한 피해로 이어진다.

 

 

'Back-End > Java' 카테고리의 다른 글

Spring Boot - CRUD  (0) 2023.05.29
Spring Boot  (0) 2023.05.26
쿠키와 세션  (0) 2023.05.23
HTTP 통신과 URL  (0) 2023.05.23
Web - 클라이언트와 서버  (0) 2023.05.22

+ Recent posts