728x90

위의 그림은 DFS와 BFS 경로를 순서대로 나타낸 것이다. 해당 그림을 통해 직관적으로 둘의 차이를 알 수 있을 것이다. 깊이 우선 탐색인 DFS는 가장 깊은 곳까지 방문하고 스택을 통해 구현한다.

너비우선탐색인 BFS는 같은 레벨 인접 노드를 전부 방문한 뒤 다음 레벨 인접 노드를 방문한다. 큐를 통해 구현한다.

 

 


깊이우선탐색 DFS

  • 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘이다.

구현 방법

1. 탐색 시작 노드를 스택에 삽입하고 방문 처리를 한다.
2. 스택의 최상단 노드에 방문하지 않은 인접 노드가 있으면 그 인접 노드를 스택에 넣고 방문 처리를 한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
3. 2번 과정을 더 이상 수행할 수 없을 때까지 반복한다.

  • 해당 그래프를 스택을 이용한다.
  • 스택은 한 방향에서만 자료를 넣고 뺄 수 있는 후입선출 방식 구조이므로 가장 늦게 들오온 노드를 가장 먼저 뺄 수 있다.
  • 또한 한 번 담았던 노드는 다시 담지 않는다.

1. 먼저 시작 노드인 0번 노드를 스택에 담았다.

2. 이후 0번 노드를 꺼내 출력하고 그 인접 노드인 1번 노드를 스택에 담았다. 

3. 이후 1번 노드를 꺼내 출력하고 그 인접 노드인 2번 노드와 3번 노드를 스택에 담았다.

4. 이후 3번 노드를 꺼내 출력하고 그 인접 노드인 4번 노드와 5번 노드를 스택에 담았다. 2번 노드는 이미 스택에 담겨있으므로 스택에 다시 추가하지 않는다.

5. 이후 5번 노드를 꺼내 출력하고 그 인접 노드인 6번 노드와 7번 노드를 스택에 담았다. 

6. 이후 7번 노드를 꺼내 출력하고 인접 노드가 없으므로 더 담지 않는다.

7. 이후 6번 노드를 꺼내 출력하고 그 인접 노드인 8번 노드를 스택에 담았다.

8. 이후 8번 노드를 꺼내 출력하고 인접 노드가 없으므로 더 담지 않는다.

9. 이후 4번 노드를 꺼내 출력하고, 2번 노드를 꺼내 출력한다, 더 꺼낼 노드가 없으므로 순회는 종료한다.

 

DFS 경로 : 0 > 1 > 3 > 5 > 7 > 6 > 8 > 4 > 2

출력 순서와 과정은 스택이기 때문에 위와 같이 이루어지는 것이다. 

 


 

너비우선탐색 BFS

그래프에서 가까운 노드부터 탐색하는 알고리즘이다.

구현방법

1. 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.
2. 큐에서 노드를 꺼내 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리를 한다.
3. 2번의 과정을 더 이상 수행할 수 없을 때까지 반복한다.

  • 해당 그래프를 BFS로 구현해보자. 
  • BFS는 Queue를 이용한다. 
  • Queue는 가장 먼저 들어온 것이 가장 먼저 나가는 선입선출 방식의 구조이다. 
  • DFS 구현과 마찬가지로 한번 큐에 담았던 노드는 다시 담지 않는다.

1. 먼저 시작 노드인 0번 노드를 큐에 담았다.

2. 이 후 0번 노드를 꺼내 출력하고, 그 인접 노드인 1번 노드를 큐에 담았다.

  • 큐는 선입선출이므로 꺼내는 방향이 그림의 화살표처럼 아래부터이다.

3. 이 후 1번 노드를 꺼내 출력하고, 그 인접 노드인 2번 노드와 3번 노드를 큐에 담았다.

4. 이 후 2번 노드를 꺼내 출력하고, 그 인접 노드인 4번 노드를 큐에 담았다.
큐는 선입선출 방식이므로 가장 아래 있는 2번 노드부터 꺼낸다. 또한, 그 인접 노드 중 1번, 3번은 이미 큐에 들어갔었으므로 4번 노드만 큐에 담긴다.

5. 이 후 3번 노드를 꺼내 출력하고, 그 인접 노드인 5번 노드를 큐에 담았다.

6. 이 후 4번 노드를 꺼내 출력하고, 그 인접 노드는 전부 큐에 담았던 적이 있으므로 다시 담지 않는다.

7. 이 후 5번 노드를 꺼내 출력하고, 그 인접 노드인 6번 노드와 7번 노드를 큐에 담았다.

8. 이 후 6번 노드를 꺼내 출력하고, 그 인접 노드인 8번 노드를 큐에 담았다.

9. 이 후 7번 노드를 꺼내 출력하고, 8번 노드를 꺼내 출력한다. 더 꺼낼 노드가 없으므로 순회는 종료한다.

 

 

 

BFS 경로 : 0 > 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8

728x90
728x90

드디어 멋사에서 spring에 대해서 배우기 시작했는데 

빌드 도구를 Maven으로 선택할지, Gradle로 선택할지에 대해 무조건 Graclle로 선택해서 둘의 차이점이 궁금해졌다.


1. 빌드 관리 도구란?

  • 우리가 프로젝트에서 작성한 java 코드와 프로젝트 내에 필요한 각종 xml, properties, jar 파일들을 JVM이나 WAS가 인식할 수 있도록 패키징 해주는 빌드 과정 == "빌드 자동화 도구" 라고 할 수 있다!
  • 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램이라 할 수 있다.

  • 애플리케이션을 개발하면서, 일반경로로 개발에 필요한 다양한 외부 라이브러리들을 다운로드하고, 해당 라이브러리를 사용하여 개발해야하는 상황이 많다.
  • 이 때 각 라이브러리들을 번거롭게 모두 다운받을 필요없이, 빌드도구 설정파일에 필요한 라이브러리 종류와 버전들, 종속성 정보를 명시하여 필요한 라이브러리들을 설정파일을 통해 자동으로 다운로드 해주고 이를 간편히 관리해주는 도구이다.


2. Maven

  • Maven은 Java용 프로젝트 관리도구로 Apache의 Ant 대안으로 만들어졌다.
  • 빌드 중인 프로젝트, 빌드 순서, 다양한 외부 라이브러리 종속성 관계를 pom.xml파일에 명시한다.
  • Maven은 외부저장소에서 필요한 라이브러리와 플러그인들을 다운로드 한 다음, 로컬시스템의 캐시에 모두 저장한다.
  • 예를 들어, "Spring Boot Data JPA Starter" 모듈을 사용하여 프로젝트를 개발하고 싶다면 메이븐 레포지토리에서 해당 모듈을 검색하여 xml 설정파일에 추가하여 사용할 수 있다. (참고로 maven용 코드 이외에도 gradle용 코드도 탭에 있다.)
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.4.RELEASE</version>
</dependency>

 

3. Gradle

  • Apacahe Maven과 Apache Ant에서 볼수 있는 개념들을 사용하는 대안으로써 나온 프로젝트 빌드 관리 툴이다. (완전한 오픈소스)
  • Groovy 언어를 사용한 Domain-specific-language를 사용한다. (설정파일을 xml파일을 사용하는 Maven보다 코드가 훨씬 간결하다.)
  • 2007년에 처음 개발되었고, 2013년에 구글에 의해 안드로이드 프로젝트의 빌드 시스템으로 채택되었다.
  • 꽤 큰규모로 예상되는 multi-project 빌드를 도울 수 있도록 디자인되었다.
  • Gradle은 프로젝트의 어느부분이 업데이트되었는지 알기 때문에, 빌드에 점진적으로 추가할 수 있다.
  • -> 업데이트가 이미 반영된 빌드의 부분은 즉 더이상 재실행되지 않는다. (따라서 빌드 시간이 훨씬 단축될 수 있다!)

 


4. Maven VS Gradle

  • 두 시스템이 빌드에 접근하는 방식에는 몇 가지 근본적인 차이점이 있다.
  • Gradle은 작업 의존성 그래프를 기반으로하는 반면, Maven은 고정적이고 선형적인 단계의 모델을 기반으로한다고 한다.
  • 성능 측면에서는 둘 다 다중 모듈 빌드를 병렬로 실행할 수 있지만, Gradle은 어떤 task가 업데이트되었고 안되었는지를 체크하기 때문에 incremental build를 허용한다. 이미 업데이트된 테스크에 대해서는 작업이 실행되지 않으므로 빌드 시간이 훨씬 단축된다.
    -> 빌드 설정 규모가 점점 커지면 커질수록, 빌드시간의 차이도 Maven과 비교하여 꽤 격차가 벌어질 수 있을것같다.
  • maven 의 경우 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 하지만, gradle 은 설정 주입 방식을 제공한다.
  • ​또한 Gradle은 concurrent에 안전한 캐시를 허용한다.
    -> 2개 이상의 프로젝트에서 동일한 캐시를 사용할 경우, 서로 overwrite되지 않도록 checksum 기반의 캐시를 사용하고, 캐시를 repository와 동기화시킬 수 있다.

  • ​고도로 사용자 정의된 빌드를 작성하기 위해서는 커스터마이징이 간편한 Gradle을 사용하는게 훨씬 낫다.
  • 아래 비교 예시 코드를 보면 확실히 와닿는느낌.
  • 위 내용만 보면, 속도나 캐시 사용 안전성에 대하여 당연히 Gradle로 사용하는게 이득이겠다는 생각이 든다.
  • Maven으로 설정된 프로젝트는 Gradle로 마이그레이션 할 수 있다고 한다.
  • 아래 코드를 통해 비교해보면

아래는 Maven 코드이다.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.programming.mitra</groupId>
    <artifactId>java-build-tools</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
            </plugin>
        </plugins>
    </build>
</project>

 

프로젝트에 기본으로 테스트 도구인 JUnit 라이브러리를 의존성 리스트에 추가하고 빌드 도구로 maven을 설정하였다.

mvn package

위 메이븐 설정 정보를 기반으로 JAR file로 빌드하기 위해 위와 같이 Maven 명령어를 실행한다.

이제, Maven에서 추가한 JUnit에 몇가지 플러그인 (Maven CheckStyle, FindBugs 및 PMD)을 추가해보면,

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>2.12.1</version>
    <executions>
        <execution>
            <configuration>
                <configLocation>config/checkstyle/checkstyle.xml</configLocation>
                <consoleOutput>true</consoleOutput>
                <failsOnError>true</failsOnError>
            </configuration>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>findbugs-maven-plugin</artifactId>
    <version>2.5.4</version>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-pmd-plugin</artifactId>
    <version>3.1</version>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Gradle에선 이러한 복잡하고 장황한 코드를 간결하게 만들어준다. (매우 간-결-, 가독성 상승)

apply plugin:'java'
apply plugin:'checkstyle'
apply plugin:'findbugs'
apply plugin:'pmd'
version ='1.0'
repositories {
    mavenCentral()
}
dependencies {
    testCompile group:'junit', name:'junit', version:'4.11'
}

위의 Gradle 설정에 기반하여 빌드 task를 실행하려면 아래와 같이 gradle 명령을 사용하면 된다.

 

gradle tasks --all

 

728x90
728x90

프로젝트에 대해 각각 레포를 만들면 갯수가 너무 많아져서 하나의 레포에 여러개의 프로젝트를 관리해야겠다고 필요성을 느꼈다.!!



1. GitHub에 아무것도 없는 빈 레포를 하나 만든다.

  • 부모 레포 역할을 함 
  • 처음 한번만 하면 됨
  • 나는 lion_10이라는 부모 레포를 만들었다.

 

2. 로컬에서 편한 위치에서 명령창(git bash here) 열고 아래 명령어 작성한다.

  • 이때 부모 레포가 비어진 경우 '빈 레포를 클론한 것 같다' 라는 경고 문구가 뜨지만 무시~~
git init
git clone <부모 레포 주소>

 

 

3. 만든 부모 레포로 이동하기

cd 부모 레포

 

 

 

4. 자식 레포들을 remote로 등록한다.

 git remote add <remote name> <자식 git 주소>
  • 나는  chat, sql, java 라는 이름으로 자식 레포를 등록했다.
  • git remote -v 명령어를 통해 잘 등록되었는지 remote를 확인해본다.

 

 

5. subtree를 이용하여 부모 레포에 자식 레포를 더해준다.

git subtree add --prefix=<깃에 저장될 폴더 이름> <자식 remote 이름> <branch명>​
  • <깃에 저장될 폴더 이름>은 깃에서 보여질 폴더의 이름을 설정하는 것이다. 
  • <자식 remote 이름>은 위에서 설정한 자식들의 remote를 지정하면 된다.
  • <branch 명>은 부모의 레포의 브랜치명을 작성하면 된다. 
  • 이때 부모 레포가 아무 커밋이 없는 경우
    'ambigous argument 'HEAD': unknown revision or path not in the working tree.'
    라는 오류가 뜰 수 있다.
  • 해결 방안 :
git commit --allow-empty -n -m "커밋메시지"

 

 

 

 

6. 깃에 push

git push

만약, git push를 했는데 오류가 난다면 기존에 데이터가 손실될 수 있기에 경고해주는 에러이다.
이는 아래 명령어를 이용하여 push한다. 

git push origin +main

 

 


* 이후에 프로젝트를 올릴 때는 아래처럼 하면 된다!!!

git clone <부모 리포지토리 주소>
cd <부모 리포지토리 이름>
git subtree add --prefix=<폴더 이름> <자식 리포지토리 주소> <branch명>
git commit -m "커밋 메시지"
git push
728x90
728x90
 
 

 

REST API란 REST를 기반으로 만들어진 API를 의미한다.

REST API를 알기 위해 REST부터 알아보자!

 


REST란?

 

  • REST(Representational State Transfer)의 약자로,
  • 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미한다.

 

즉, REST란 

  1. HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고,
  2. HTTP Method(POST, GET, PUT, DELETE, PATCH 등)를 통해
  3. 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미한다.
  4. REST는 URI와 HTTP 메소드를 사용해서 자원과 행위를 표현다.

 

CRUD Operation이란
CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말로,
REST에서의 CRUD Operation 동작 예시는 다음과 같다.

 

Create : 데이터 생성(POST)
Read : 데이터 조회(GET)
Update : 데이터 수정(PUT, PATCH)
Delete : 데이터 삭제(DELETE)

 

REST 구성 요소

REST는 다음과 같은 3가지로 구성이 되어있다. 

  1. 자원(Resource) : HTTP URI
  2. 자원에 대한 행위(Verb) : HTTP Method
  3. 자원에 대한 행위의 내용 (Representations) : HTTP Message Pay Load

 

REST의 특징

  1. Server-Client(서버-클라이언트 구조)
  2. Stateless(무상태)
  3. Cacheable(캐시 처리 가능)
  4. Layered System(계층화)
  5. Uniform Interface(인터페이스 일관성)

 

REST의 장단점

 

- 장점 

  • HTTP 프로토콜의 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라를 구출할 필요가 없다.
  • HTTP 프로토콜의 표준을 최대한 활용하여 여러 추가적인 장점을 함께 가져갈 수 있게 해 준다.
  • HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하다.
  • Hypermedia API의 기본을 충실히 지키면서 범용성을 보장한다.
  • REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악할 수 있다.
  • 여러 가지 서비스 디자인에서 생길 수 있는 문제를 최소화한다.
  • 서버와 클라이언트의 역할을 명확하게 분리한다.

 

- 단점 

  • 표준이 자체가 존재하지 않아 정의가 필요하다.
  • HTTP Method 형태가 제한적이다.
  • 브라우저를 통해 테스트할 일이 많은 서비스라면 쉽게 고칠 수 있는 URL보다 Header 정보의 값을 처리해야 하므로 전문성이 요구된다.
  • 구형 브라우저에서 호환이 되지 않아 지원해주지 못하는 동작이 많다.(익스폴로어)

 

❓ URI와 URL의 차이점

  • URI : Uniform Resource Locator로 인터넷 상 자원의 위치
  • URL : Uniform Resource Identifier로 인터넷 상의 자원을 식별하기 위한 문자열의 구성
    1. URI는 URL을 포함함

그럼...

 

REST API란?

 

  • API
    • 데이터와 기능의 집합을 제공하여 컴퓨터 프로그램간 상호작용을 촉진하며, 서로 정보를 교환가능 하도록 하는 것
  • RESPT API란, 쉽게 REST의 원리를 따르는 데이터를 상호교환하게 설계된 API를 의미한다. 
  • 잘 풀어서 말해보면
  • HTTP를 잘사용하기위해, URI와 HTTP메소드를 사용해서, URL로 어떤 자원에 접근할 것인지, 메소드로 어떤 행위를 할것인지 표현하여 설계된 API를 말한다.
  • 하지만 REST API를 올바르게 설계하기 위해서는 지켜야 하는 몇가지 규칙이 있다.!!

 

REST API 설계 예시

1. URI는 동사보다는 명사를, 대문자보다는 소문자를 사용하여야 한다.

Bad Example http://ch9800113.com/Running/
Good Example  http://ch9800113.com/run/  

 

2. 마지막에 슬래시 (/)를 포함하지 않는다.

Bad Example http://ch9800113.com/test/  
Good Example  http://ch9800113.com/test

 

3. 언더바 대신 하이폰을 사용한다.

Bad Example http://ch9800113.com/test_blog
Good Example  http://ch9800113.com/test-blog 
 

 

4. 파일확장자는 URI에 포함하지 않는다.

Bad Example http://ch9800113.com/photo.jpg  
Good Example  http://ch9800113.com/photo 
 

 

5. 행위를 포함하지 않는다.

Bad Example http://ch9800113.com/delete-post/1  
Good Example  http://ch9800113.com/post/1 
 

 

REST API 설계 예시


REST ful이란?

 

 

 

 

REST FUL이란,

  • REST의 원리를 따르는 시스템을 의미한다.
  • 하지만 REST를 사용했다 하여 모두가 RESTful 한 것은 아니다.  
  • REST API의 설계 규칙을 올바르게 지킨 시스템을 RESTful하다 말할 수 있으며,
  • 모든 CRUD 기능을 POST로 처리 하는 API 혹은 URI 규칙을 올바르게 지키지 않은 API는 REST API의 설계 규칙을 올바르게 지키지 못한 시스템. 즉, REST API를 사용하였지만 RESTful 하지 못한 시스템이라고 할 수 있다.

 

또한, API가 RESTful로 간주되기 위해서는 몇가지 조건이 있는데 그 중 가장 중요한 건,

 

  1. 클라이언트-서버 커뮤니케이션: 요청 간에 클라이언트 정보가 저장되지 않으며, 각 요청이 분리되어 있고 서로 연결되어 있지 않음
  2. Stateless(무상태)

클라이언트와 서버간 종속적이지 않다는 말이다.

즉, 서버는 클라이언트의 정보를 저장-유지하고 있지않아, 같은 사람이보낸 정보도, 같은사람이 보냈는지 정보를 유지하고있지 않다는 말이다.

 

이말은 즉, 클라이언트가 요청시 마다, 자기 정보를 보내야하고, 서버는 받은 정보로 클라이언트의 정보를 확인한다.

 

따라서,  

  • 멀티플랫폼 지원이 용이하고,
  • Stateless한 RESTful API는 Client의 요청(호출)을 어느 Server라도 동일하게 처리할 수 있고
  • 즉, 어떤 Server라도 Client들의 요청에 응답할 수 있다는 것은, 서버 환경이 분산되었든 아니든, Client쪽에서는 Server쪽에 신경 쓸 필요 없이 API 호출만 하면 원하는 결과를 받을 수 있다는 점에서 RESTful API가 활용되는 것이다.

RESTful API를 사용하면 좋은점

위의 한문장이 사실 rest api를 의미하지만, 단순 정의일뿐 면접관이 의도한 대답은 아니라고 생각된다.

 

REST API의 장점은

 

1. 보기 좋다. 

  • URL만 보고 어떤 자원에 접근할 것인지, 메소드를 보고 어떤 행위를 할지 알 수 있기 때문에, 개발을 할때 용이하다.

 

2. 자원을 아낄 수 있다.

  • 1개의 URI로 4개의 행위(CRUD)를 명시할 수 있기 때문에, 굉장히 효율적이다.

 

3. stateless한 상태를 유지할  수 있다.

  • 이게 제일 중요!!
  • REST API의 가장 큰 특징으로, 다양한 브라우저와 모바일에서 통신할 수 있도록 한다.
  • 클라이언트가 서버에 종속적이지 않아도 되기때문에, scale out한 상황에서도 용이하다.

 

 


정리

RESTful API(=REST API)란,

 

  • REST의 설계 규칙을 잘 지켜서 설계된 API = REST한 방식으로 클라이언트와 서버간 상호 데이터 교환을 하는 API
  • 서로간에 stateless한 특징을 가지는 API
  • 추가로 Hypermedia (링크)를 통해서 애플리케이션의 상태 전이가 가능해야 하고 Hypermedia (링크)에 자기 자신에 대해한 정보가 담겨야 있어야 진정한 REST API라고 볼 수 있다..!!!

 

 

 

 


References

 
728x90
728x90

❗️리눅스(Linux)란?

👉 Linux는 커널이다. ⇒ 커스텀 OS 만들기 가능

  • Windows나 Mac과 달리 Linux는 실제로 분리되고 잘 정의된 운영 체제가 아니다.
  • 오히려 Linux는 커스터마이즈된 OS를 만들 수 있는 커널이다.
  • Linux 커널을 기반으로 한다.
  • Linux 아키텍처는 커널, 시스템 라이브러리, 시스템 도구, 개발 도구 및 최종 사용자 도구와 같은 구성 요소로 구성된다.
  • 커널은 운영 체제의 핵심이다.
  • 장치 메모리를 관리하고 프로세스를 관리한다.
  • Linux 커널을 기반으로 하는 운영 체제 시스템을 Linux 배포판이라고 한다.

👉 Linux 커널은 오픈 소스이다. ⇒ 커스텀 OS 만들기 가능

  • Linux는 유닉스 기반의 무료 오픈 소스 운영 체제이다.
  • Linux를 Windows 및 Mac과 구별되는 특성 중 하나는 오픈 소스라는 점이다.
  • 이는 커널을 통해 사용자가 자신의 운영 체제를 개발할 수 있음을 의미한다.
  • Linux는 무료 오픈 소스이기 때문에 누구나 무료로 다운로드하여 코드를 변경하여 수정 된 사본을 재배포 할 수 있다.
  • 이것은 Windows, Mac과 같이 미리 정의되고 제한된 OS에 익숙하지 않은 보다 기술적인 사용자에게 특히 유용하다.
  • 현재 사용자가 기본 설정에 따라 다운로드 할 수 있는 Linux 배포판을 사용할 수 있다.
  • 이러한 배포판은 여러 개발자들이 만들었다.
  • 전 세계 개발자들이 리눅스 코드를 공유하고 공동으로 개발할 수 있다.
  • Linux 커널은 사용자를 위한 운영 체제 역할을 하는 다양한 배포판을 지원한다.
  • 이러한 배포판 중에 하나가 바로 Ubuntu이다.

👉 Linux 사용되는 곳

  • Linux는 보편적으로 개인용 컴퓨터, 데스크탑, 게임 개발, 임베디드 시스템, 스마트 폰, 태블릿 등에 사용된다.

👉 리눅스의 장점

  • 안정적이고 안전한 운영 체제이다.
  • 여러 사용자가 동시에 작업 할 수 있기 때문에 다중 사용자 시스템이다.
  • 동시에 더 많은 프로세서를 지원하고 사용하는 OS이다.
  • 또한, 그것은 멀티 태스킹이며 많은 프로세스를 동시에 실행할 수 있다.

👉 운영 체제(OS)란?

  • OS : Operationg System
  • OS란 컴퓨터 시스템의 각종 하드웨어적인 자원과 소프트웨어적인 자원을 효율적으로 운영 관리함으로써 사용자가 시스템을 이용하는데 편리함을 제공하는 시스템 소프트웨어를 말한다.
  • OS는 수 많은 애플리케이션들이 잘 동작할 수 있도록 자원(리소스)를 할당하고 관리한다.
  • 따라서 OS는 하드웨어와 소프트웨어를 하나로 묶는 핵심 소프트웨어(중개자 역할)이다.
  • OS의 핵심 목적은 사용자가 편리하고 효율적인 방식으로 프로그램을 실행하는 환경을 제공하는데 있다.
  • 하드웨어 및 소프트웨어를 관리하는 실행관리자라고도 할 수 있다.
  • 또한 외부의 접근도 방어해주는 역할도 한다. (그 외에도 여러가지 기능을 제공한다.)

👉 커널(kernel)이란?

  • 커널이란 컴퓨터의 운영 체제의 핵심이 되는 컴퓨터 프로그램의 하나이다.
  • 시스템의 모든 것을 완전히 통제한다.
  • 운영 체제의 다른 부분 및 응용 프로그램 수행에 필요한 여러 가지 서비스를 제공한다.
  • 핵심이라고도 한다.
  • 보안, 자원 관리, 추상화 같은 역할을 한다.

👉 운영 체제와 커널의 차이

  • 운영 체제는 크게 사용자 영역과 커널 영역으로 나눠져 있다.
  • 사용자 영역은 실제 사용자가 응용프로그램(애플리케이션)을 이용하기 위해서 마련한 공간이고, 커널 영역은 사용자 영역에서 사용자가 이용하는 프로그램을 안전하고 효율적으로 작동하기 위해서 컴퓨터의 자원들을 관리하는 영역이다.
  • 커널은 운영 체제의 일부분으로, 운영 체제의 핵심적인 역할을 하는 부분이다.
  • 커널은 운영 체제에서 CPU, 메모리, 입출력 장치등과 같은 중요한 자원을 초기화하고 관리하는 부분이다.

👉 배포판이란?

  • 리눅스에서 작동하는 여러 종류의 프로그램을 꾸러미 하나로 모아놓은 것을 말한다.
  • 리눅스 프로그램은 제각각 작동할 수 있지만 두가지 이상 프로그램이 만나 주어진 일을 처리하는 경우도 있다.
  • 이처럼 상호작용이 잘되는 것들을 셀렉해서 우분투 같은 배포판이 등장하는 것이다.
  • 배포판에 대해서는 배포한 개인 또는 단체나 회사가 업그레이드 및 수정을 도맡아 해준다.
  • 이처럼 사람들이 저마다 좋은 프로그램들을 모아 만들어지는 리눅스의 배포판들은 대게 주요 배포판의 영향을 받아 만들어지기도한다.
  • 배포판 현황을 사람에 비유하면 리눅스에는 3대 명문 가문으로 데비안, 레드햇, 슬랙웨어가 있고 각 가문에 후손 격인 배포판들이 여러 개 있다.
  • 우분투는 데비안 가문 소속으로 쿠분투, 에듀분투 같은 자매를 두고 있다.

❗️우분투(Ubuntu)란?

  • 다양한 Linux 배포판이 있다.
  • 그들 중 일부는 Red Hat, CentOS, Debian, Fedora, Linux Mint이다.
  • 우분투는 또한 Linux 배포판이다.
  • 우분투에는 다양한 버전이 있다.
  • 우분투 데스크톱 버전은 개인용 컴퓨터에 적합하다.
  • Ubuntu Server는 클라우드 및 서버에 적합하고 Ubuntu Core는 IoT (Internet of Things) 기반 장치를 개발하는 데 적합하다.
  • Edubuntu는 많은 교육 응용 프로그램이있는 우분투 교육용 이다.
  • 우분투에는 그래픽 사용자 인터페이스 (GUI)와 명령 행 인터페이스 (CLI)가 있다.
  • GUI를 사용하면 단추, 창, 텍스트 상자 등의 그래픽 구성 요소를 사용하여 쉽게 작업을 수행 할 수 있다.
  • 또한 CLI를 통해 사용자는 명령을 입력하고 신속하게 실행할 수 있다.
  • 또한 Ubuntu를 쉽게 설치할 수 있으며, 시스템을 빠르게 부팅 할 수있는 Multi Boot Loader가 포함되어 있다.
  • 우분투 시스템에는 많은 소프트웨어가 포함되어 있다.
  • Libre Office, Firefox 웹 브라우저, VLC 미디어 플레이어, 김프 Adobe Photoshop 클론, MySQL 데이터베이스 관리 시스템 등이 있다.
  • 사용자는 Ubuntu 소프트웨어 센터 또는 다른 APT 기반 패키지 관리 도구에서 더 많은 무료 소프트웨어 및 도구를 다운로드 할 수 있다.
  • 또한 바이러스, 웜, 스파이웨어 및 기타 맬웨어와 같은 악성 소프트웨어로부터 데이터 및 리소스를 보호하는 보안 운영 체제이다.

❗️정리

  • 즉, 리눅스는 커널(컴퓨터 자원 등을 관리하는 영역)을 기반으로 하는 시스템 소프트웨어이기 때문에 Windows, Max 운영 체제에 있는 소프트웨어, GUI같은 것이 없다.
  • 이러한 리눅스 커널을 가지고 사용자 맞춤 운영 체제로 커스터 마이징(배포판)해서 사용하고 재 배포 할 수 있다.
  • 그래서 리눅스는 운영 체제라기 보단 커널이고 이러한 리눅스 커널을 기반으로 운영 체제가 만들어 진 것이다. 그것이 배포판이다.
  • 조금 더 자세한 설명을 위해서는 먼저 컴퓨터 하드웨어와 운영 체제에 대한 깊은 이해가 필요해 보인다.

❗️Reference

참고 : IT관련용어 [ OS ] 운영체제 란 무엇인가? (운영체제 종류와 특징)

참고 : What is Ubuntu? – www.futuredesktop.org

참고 : 1.2 배포판이란?

참고 : [rh-smart-meta-title]

728x90

+ Recent posts