전체 글

반응형

Go 의 인기 Web Framework 'Gin'


해당 튜토리얼은 'Building Go Web Applications and Microservices Using Gin'의 내용을 번역하며 개인적으로 정리한 것입니다.


이번 시간에는 Gin Web Framework를 기초로, 기본적인 구조를 직접 만들어보고자 합니다.

 

1. 의존성 설치

튜토리얼에서 사용할 어플리케이션에서는 외부 의존성 프로그램인 Gin 프레임워크만을 사용합니다. 다음 명령어를 입력하여 최신 버전을 설치해주세요.

 

$ go get -u github.com/gin-gonic/gin

 

2. 재활용 가능한 템플릿 만들기

우리가 제작할 어플리케이션은 템플릿을 사용하여 웹 페이지를 표시합니다. 해당 페이지에는 Header, Menu, Sidebar 및 footer와 같은 여러 부분이 필요할 것이며 이 부분들은 모든 페이지에서 공통적으로 사용됩니다. Go Lang을 사용해서 다른 템플릿에서 가져올 수 있는 재사용 가능한 템플릿 스니펫을 만들 수 있습니다.

 

Header와 Footer는 모든 템플릿에서 공통적으로 재사용되는 부분입니다. 따라서 제작 순서는 Header 템플릿에서 사용할 자체 템플릿 파일에 메뉴를 생성하고, Header와 Footer를 가져올 인덱스 페이지용 템플릿을 만드는 식이 될 것입니다. 지금 생성할 모든 템플릿 파일들은 templates라는 이름의 별도의 디렉토리안에 배치하도록 합니다. 먼저 튜토리얼을 시작하고자하는 폴더 안에 templates 폴더를 생성하고 menu.html 파일을 작성하는 것부터 시작해보도록 하겠습니다.

 

▶ templates/menu.html

 

<!--menu.html 모든 페이지에서 공통으로 사용-->

<nav class="navbar navbar-default">
  <div class="container">
    <div class="navbar-header">
      <a class="navbar-brand" href="/">
        홈으로
      </a>
    </div>
  </div>
</nav>

 

우선 현재 메뉴에는 홈 화면으로 돌아갈 수 있는 링크만 포함이 되어 있습니다. 우리는 어플리케이션에 기능을 추가할 때, 여기에 하나씩 추가하게 될 것입니다. 

 

▶ templates/header.html

 

<!-- header.html -->

<!doctype html>
<html>
    <head>
        <!-- 타이틀 페이지를 세팅하기 위해 타이틀을 변수로 사용합니다 -->
        <title>{{ .title }}</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta charset="UTF-8">

        <!-- 부트스트랩을 사용해서 멋진 어플리케이션을 만들어봅시다 -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
        <script async src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
    </head>
    
    <body class="container">
        <!--  이 위치에 menu.html 템플릿 포함시키기 -->
        {{ template "menu.html" . }}

 

▶ templates/footer.html

 

<!--footer.html-->

  </body>
  
</html>

 

 

튜토리얼을 제작하기 위해 우리는 오픈소스 부트스트랩의 프레임워크를 사용합니다. 파일의 대부분은 HTML형식을 가지고 있습니다. 다만 우리가 여기서 주목해야할 부분이 두 줄 있습니다.

 

<title>{{ .title }}</title>

 

위의 코드는 어플리케이션 안에서 설정해야하는 .title 변수를 사용하여 페이지 제목을 동적으로 설정하는데 사용됩니다.

 

{{ template "menu.html" . }}

 

위의 코드는 menu.html파일에서 메뉴 템플릿을 가져오는데 사용됩니다. Go Lang은 이러한 방식을 사용하여 하나의 템플릿을 다른 템플릿으로 가져올 수 있습니다.

 

Footer 템플릿에 정적 HTML이 포함되어 있습니다. 인덱스 페이지의 템플릿은 Header와 Footer를 사용하게 하고, 간단하게 안녕 Gin? 이라는 메시지를 출력할 수 있도록 해봅시다.

 

▶ templates/index.html

 

<!-- index.html -->

<!-- header.html 템플릿을 이 위치에 포함시킵니다 -->
{{ template "header.html" .}}

<h1>안녕 Gin?</h1>

<!-- footer.html 템플릿을 이 위치에 포함시킵니다 -->
{{ template "footer.html" .}}

 

인덱스 템플릿과 마찬가지로 다른 페이지의 템플릿도 비슷한 방식으로 Header와 Footer 템플릿을 재사용할 것입니다.

 

여기까지 따라오셨다면 어플리케이션의 디렉토리 구조는 다음과 같이 구성되어 있을 것입니다.

 

Templates 폴더 안의 4가지 html 파일이 있습니다

 

 


 

다음 시간에는 본격적으로 어플리케이션 구동을 위한 파일들을 생성해볼 것입니다. 원래 계획대로라면 Gin 체험하기 (3)에서 기본 템플릿 작성과 라우터 생성하고 안녕 Gin 부분을 로컬호스트를 통해 구동하는 부분까지 진행해보려 했습니다만 다 합치다보니 글이 너무 길어지기에 부득이하게 분리하여 업로드할 계획입니다. 포스팅 내용이 과하게 짧은 것은 저도 좋아하지 않지만, 필요한 부분만 찾아서 보시기를 원하시는 분들이 계실 수 있다는 생각을 하고 있기에 이런 결정을 하게 되었습니다.

 

언제나 많은 피드백을 부탁드리고 감사히 받고 있습니다. 감사합니다!

 

 

반응형
반응형

Go 의 인기 Web Framework 'Gin'


해당 튜토리얼은 'Building Go Web Applications and Microservices Using Gin'의 내용을 번역하며 개인적으로 정리한 것입니다.


이번 시간부터 우리는 Go Lang의 Gin Web Framework를 사용해서 기사(Article) 목록과 기사의 세부 정보를 표시하는 간단한 웹 어플리케이션을 구축해볼 것입니다. 이번 튜토리얼을 통해 우리는 Gin Web Framework를 사용해서 웹 어플리케이션을 구축하는 전반적인 방법을 공부해볼 수 있을 것입니다.

0. 시작 전에

튜토리얼 진행을 위해서 우선 Go, curl, git 이 설치되어 있어야 합니다.

 

Go 를 설치해주세요!

1. 왜 Gin으로 제작하나요?

Gin은 웹 어플리케이션, 마이크로 서비스를 구축하는데 사용할 수 있는 고성능 마이크로 프레임워크입니다. Go Lang의 내장 라이브러리인 net/http는 HTTP 서버를 쉽고 간편하게 만들 수 있는 훌륭한 기능이지만, 유연성이 떨어지고 구현을 위해 일부 상용 코드를 필요로 합니다. 또한 Go Lang에는 '패턴'을 기반으로 하는 경로를 처리하는 내장 지원 기능이 없습니다. 추가 코드 작성을 통해 기능을 구현할 수 있으나 코드를 모든 곳에서 반복사용하거나, 재사용을 위한 라이브러리를 제작해야할 가능성이 높습니다.

 

Gin에서는 이러한 상용 코드를 줄이고 웹 어플리케이션 작성을 간단하게 만들어 줄 수 있는 라우팅, 미들웨어 지원, 렌더링과 같은 기능들이 포함되어 있습니다. 

 

2. 어플리케이션 설계

Gin에서 Request가 어떻게 처리되는지 간단히 살펴보고 가도록 합시다. 일반적인 웹 어플리케이션, API 서버, 마이크로서비스에 대한 제어 흐름은 다음과 같습니다.

요청(Request) ➡ 라우터 분석(Route Parser) ➡ ([선택사항] 미들웨어) ➡ 라우터 핸들러(Route handler) ➡ ([선택사항] 미들웨어) ➡ 응답(Response)

 

3. 어플리케이션 기능

튜토리얼을 통해 우리가 직접 만들어볼 어플리케이션은 간단한 기사(Article) 관리 웹 페이지입니다. 이 어플리케이션은 다음과 같은 기능을 수행하도록 작성할 것입니다.

 

  • (로그인하지 않은) 사용자가 사용자 이름과 패스워드를 등록할 수 있도록 합니다
  • (로그인하지 않은) 사용자가 사용자 이름과 패스워드로 로그인하도록 합니다
  • (로그인한) 사용자가 로그아웃할 수 있도록 합니다
  • (로그인한) 사용자가 새 기사(Article)를 작성할 수 있도록 합니다
  • (모든 유저가) 메인 페이지의 모든 기사 목록을 표시합니다
  • (모든 유저가) 자체 페이지에 단일 기사를 표시합니다

해당 기능들 외에도 기사 목록과 하나의 기사는 HTML, JSON, XML 형식으로 접근할 수 있어야합니다.

 

이 과정들을 통해 우리는 Gin을 사용하여 기존 웹 어플리케이션, API 서버, 마이크로서비스를 설계하는 방법을 그려낼 수 있습니다. 우리는 Gin이 제공하는 다음의 기능들을 사용할 것입니다.

 

  • 라우팅(Routing) : 다양한 URL의 처리
  • 사용자정의 렌더링(Custom rendering) : 응답(Response) 형식을 처리
  • 미들웨어(Middleware) : 인증(authentication)을 구현

또한 모든 기능이 의도한대로 작동하는지 테스트를 통한 검증도 작성할 것입니다.

 

4. 라우팅(Routing)

라우팅(Routing)은 모든 최신 프레임워크들이 제공하는 핵심 기능 중 하나입니다. 모든 웹 페이지, API 엔드포인트는 URL로 액세스됩니다. 프레임워크는 라우트를 사용하여 이러한 URL에 대한 요청을 처리합니다.

예를 들어, URL이 http://www.example.com/some/random/route 이면 경로는 /some/random/route 가 되는 것입니다.

 

Gin구성과 활용이 용이하고 빠른 간편 라우터를 제공합니다. 지정된 URL을 처리하는 것 외에도 Gin 라우터는 패턴, 그룹화된 URL도 처리할 수 있습니다.

 

이번 튜토리얼에서 우리는,

  •  / (HTTP GET 요청) 경로에 인덱스 페이지를 제공합니다 .
  • /u 라우터 하위 페이지에 사용자 관련 경로를 그룹화하고,
    • /u/login(HTTP GET 요청) 에서 로그인 페이지를 제공합니다
    • /u/login(HTTP POST 요청) 에서 로그인 자격 증명을 처리합니다
    • /u/logout(HTTP GET 요청) 에서 로그아웃합니다
    • /u/register(HTTP GET 요청) 에서 등록 페이지를 제공합니다
    • /u/register(HTTP POST 요청) 에서 등록 정보를 처리합니다
  • /article 루트 하위 페이지에 기사글을 그룹화하고,
    • /article/create(HTTP GET 요청) 에서 기사 생성 페이지를 제공합니다
    • /article/create(HTTP POST 요청) 에서 제출된 기사를 처리하고,
    • /article/view/:article_id(HTTP GET 요청) 에서 기사 페이지를 제공합니다 특히, :article_id 이 부분은 주의해주세요. : 으로 시작하는 부분이 동적 라우터(Dynamic Route)임을 나타냅니다. 이는 :article_id의 모든 값을 포함할 수 있으며 Gin은 이 값을 라우트 핸들러(Route handler - 경로처리) 에서 사용할 수 있도록 합니다.

 

5. 렌더링(Rendering)

웹 어플리케이션은 HTML, TEXT, JSON, XML, 기타 형식과 같이 다양한 형식으로 응답을 렌더링할 수 있습니다. API 엔드포인트와 마이크로서비스는 일반적으로 JSON 형식뿐만 아니라 원하는 다른 형식의 데이터로도 응답이 가능합니다.

 

다음 섹션을 통해서 우리는 기능을 복제하지 않고도 다양한 유형의 응답을 렌더링하는 방법을 살펴볼 것입니다. 우리는 주로 HTML 템플릿으로 요청에 응답합니다. 그러나 JSON, XML 데이터로 응답할 수 있는 두 엔드포인트도 정의할 것입니다.

 

 

미들웨어 개념도. sw중심사회 포털 자료

6. 미들웨어(Middleware)

Go Lang 웹 어플리케이션의 관점에서 보자면 미들웨어HTTP 요청을 처리하는 동안 모든 단계에서 실행할 수 있는 코드의 조각입니다. 일반적으로 여러 경로에 적용하려는 공통 기능을 캡슐화(encapsulate)하는 데 사용됩니다. HTTP 요청이 처리되기 전, 후에 미들웨어를 사용할 수 있습니다. 미들웨어의 일반적인 용도에는 권한 부여, 유효성 검사 등이 있습니다.

 

요청이 처리되기 전에 미들웨어가 사용되는 경우, 요청에 대한 변경 사항은 메인 라우터 핸들러에서 사용할 수 있습니다. 이는 특정 요청에 대해 일부 유효성 검사를 구현하려는 경우에 편리합니다. 반면에 라우트 핸들러 이후에 미들웨어를 사용하면 라우트 핸들러로부터 응답을 받게 됩니다. 이 경우 라우터 핸들러의 응답을 수정하는 데 사용할 수 있습니다.

 

Gin을 사용하면 여러 경로를 처리하는 동안, 공유해야 하는 몇 가지 공통 기능을 구현하는 미들웨어를 작성할 수 있습니다. 이것은 코드베이스를 작게 유지하고 관심사를 분리하며 코드 유지 관리성을 향상시킵니다.

 

코드베이스(Code base)  : 특정 시스템, 애플리케이션, 컴포넌트 등을 빌드할 때 사용되는 소스코드의 전체집합, 그것을 담은 저장소

 

우리는 일부 페이지와 작업이 다음과 같은지 명확히 해야합니다. 예를 들어, 기사 작성, 로그아웃은 로그인한 사용자만 가능하도록 하고, 일부 페이지 및 작업(회원가입, 로그인)은 로그인하지 않은 사용자만 가능하도록 하는 것 등을 말합니다.

 

이 논리를 모든 경로에 적용하면 상당히 지루하고 반복적이며 오류가 발생하기 쉽습니다. 운 좋게도 이러한 각 작업에 대한 미들웨어를 만들고 특정 경로에서 재사용할 수 있습니다.

 

우리는 튜토리얼에서 모든 경로에 적용시킬 미들웨어를 만들 것입니다. 이 미들웨어(setUserStatus)는 인증된 사용자의 요청인지 여부를 검사합니다. 그런 다음 템플릿에서 이 플래그를 기반으로 하는 일부 메뉴 링크의 가시성을 수정하는 데 사용할 수 있는 플래그를 설정합니다.

 


 

다음 시간부터는 본격적으로 Gin Web Framework를 설치하고 웹 페이지를 구성할 HTML 파일들과 main.go 에 들어갈 소스코드를 직접 작성해보도록 하겠습니다. 위의 내용은 전반적인 기본 지식으로, 이해하신 내용들을 기반으로 다음 단계의 작업을 진행하시면 더욱 튜토리얼을 효율적으로 공부하실 수 있을 것입니다.

 

 

 

반응형
반응형

Go 의 인기 Framework 'Gin'


많은 프로그래밍 언어들은 저마다의 멋진 프레임워크라이브러리를 가지고 있습니다. 

 

일반적으로 프로그래밍 언어를 사용할 때 말하는 라이브러리(Library)란 쉽게 가져와서 사용할 수 있는 도구들을 모아놓은 공구함같은 것이라고 생각하시면 됩니다. 프로그래밍을 할 때 필요할만한 도구들을 가져와서 개발환경에 맞게 사용할 수 있도록 제공하는 도구죠. 

 

이에 반해 프레임워크(Framework)는 흔히 말하는 뼈대, 기본골격을 의미합니다. 이 안에는 여러 인터페이스와 컴포넌트들이 포함이 되어있습니다. 일정한 뼈대가 잡혀있고 그 안에서 개발자가 자신의 목표에 맞는 도구들을 사용해서 결과물을 만들어낼 수 있도록 돕는 역할을 하는 것이죠.

 

JAVA의 프레임워크 spring

국내에서 정말 많이 사용되는 유명 프레임워크로는 JAVASpring이 있습니다. 채용 홈페이지에서도 대부분의 JAVA 개발자 채용의 경우 Spring Framework에 대한 경험을 필수 혹은 우대한다는 내용의 Job description을 심심치 않게 확인할 수 있습니다. 

 

비단 JAVA만 그런 것이 아닙니다. Ruby on Rails, Pythondjango 또한 해당 언어를 사용하는 개발자라면 누구나 사용해봤거나 공부해보고자할 정도로 널리 알려진 프레임워크입니다. 해당 언어를 사용하지 않는 개발자들도 딱 들으면 알 정도로 유명합니다.


Go Lang에서는 이런 JAVA의 spring, Python의 django 같은, 언어를 대표할만한 프레임워크가 어떤 것이 있을까요?

 

GitHub에 한 repo는 GitHub의 STAR를 받은 수를 기준으로 Go Lang의 Web Framework 순위를 집계하고 있습니다.

 

https://github.com/mingrammer/go-web-framework-stars

 

GitHub - mingrammer/go-web-framework-stars: Web frameworks for Go, most starred on GitHub

:star: Web frameworks for Go, most starred on GitHub - GitHub - mingrammer/go-web-framework-stars: Web frameworks for Go, most starred on GitHub

github.com

 

작년까지는 가장 많은 star를 받은 Gin과 두번째로 많이 받은 Beego 간의 star 차이가 크지 않았는데 2021년 8월 현재를 기준으로 Gin 5만 vs Beego 2.6만 정도로 거의 2배에 가까운 차이를 벌렸습니다. Gin이 압도적으로 치고 올라가는 모습입니다. 개발에 있어 가장 많은 사용자가 있고, 가장 이슈와 포크가 활성화된 오픈소스는 분명히 큰 장점을 가집니다. 

 

Gin은 사용이 간편하면서도 빠른 속도가 장점인 프레임워크입니다. Go Lang의 프레임워크 체험해보기에 아주 좋을 것입니다.


1. Gin 설치하기

Gin의 패키지를 설치하려면 Go version이 1.13이상이어야 합니다.

 

Mac은 터미널, 윈도우에서는 CMD를 통해 다음 명령어를 입력하여 패키지를 설치합니다.

 

$ go version   : Go 버전 확인

 

$ go get -u github.com/gin-gonic/gin    : Gin 패키지 설치

 

패키지 설치가 끝나면 작성할 코드에 Gin을 임포트합니다

 

import github.com/gin-gonic/gin

 

Gin 가이드에 따르면 필요에 따라 net/http 임포트를 하도록 권장하고 있는데, IDE 환경에서 작성 시 별도의 임포트를 하지 않아도 자동으로 임포트되므로 놓치더라도 큰 문제가 발생하지 않을 것입니다.

 

2. 간단 예제 작성으로 동작시켜보기

다음의 예제를 작성하여 Gin 패키지가 제대로 동작하는지 직접 확인해보도록 합시다.

 

package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

 

위의 예제를 직접 작성해서 실행하시면 GET/ping 서버가 동작하고, 메시지가 잘 출력되고 있음을 확인할 수 있습니다.

 

ping.... pong?!

 

Gin으로 기본적인 Router를 만드는 방법은 다음과 같습니다.

 

r := gin.Default()

 

예제에는 r을 사용했지만 Gin의 다른 많은 예제에서는 router 로 정의하고 있습니다.

 

서버 포트 변경을 위해서 r.Run에서 원하는 포트번호값을 입력해줄 수 있습니다.

 

r.Run(":포트번호")

 

3. GET, POST, PUT, PATCH, DELETE, OPTIONS 사용하기

 

Gin을 통해 REST API 설계를 작성해볼 수 있습니다

 

func main() {
	router := gin.Default()

	router.GET("/someGet", getting)
	router.POST("/somePost", posting)
	router.PUT("/somePut", putting)
	router.DELETE("/someDelete", deleting)
	router.PATCH("/somePatch", patching)
	router.HEAD("/someHead", head)
	router.OPTIONS("/someOptions", options)

	router.Run()
}

 


다음 포스팅에서는 Gin 프레임워크를 활용하여 직접 간단한 웹 서버를 만들어보는 예제를 통해 조금 더 상세한 내용을 알아보도록 하겠습니다. 

 

 

반응형
반응형


 

CCT (Cisco Certified Technician)

CCNA (Cisco Certified Network Associate)

CCNP (Cisco Certified Network Professional)

CCIE (Cisco Certified Internetwork Expert)

 

1. 개요

 

Cisco?

Cisco는 네트워킹 장비 등과 통합 커뮤니케이션 시스템, 네트워크 솔루션을 제공하는 세계적인 네트워킹 전문 기업입니다. 세계 라우터(Router) 시장 점유율 45%, 웹 컨퍼런싱 시장 점유율 41%로 업계 1위를 차지하고 있으며 3만개 이상의 글로벌 고객사를 확보하고 있는 기업입니다. CCNA와 CCNP, CCIE는 이 Cisco에서 주관하는 국제 자격 시험입니다.

 

2021년 현재 기준으로 Cisco에서 주관하는 자격 시험의 레벨 단계는 Entry - Associate - Specialist - Professional - Export 로 구분되어 있으며 각 단계별로 다양한 자격 시험이 존재합니다.

 

CCT

Cisco에서 주관하는 국제 공인 자격증으로 Cisco의 네트워크 장비를 사용하고 유지 관리할 수 있는 능력을 검증하는 가장 기초적인 자격증으로 시험코드는 100번으로 시작합니다.

 

Cisco Cerified Network Associate

CCNA

Cisco에서 주관하는 국제 공인 자격증으로 Cisco의 네트워크 기술 활용 능력을 검증하는 자격 시험 중 기본적인 자격증으로 시험코드는 200-301 CCNA 입니다. Core 시험에 해당하는 200-301 CCNA 하나만 합격해도 자격을 취득할 수 있습니다.

Cisco Certified Network Professional

CCNP

Cisco에서 주관하는 국제 공인 자격증으로 Cisco의 네트워크 전문 기술 활용 능력을 검증하는 자격 시험으로 시험코드 350-401의 Core 시험과 350-N01에 해당하는 Collaboration, Data Center, Security, Service Provider 등의 집중 선택 시험 중 한 가지 시험을 합격하면 자격을 취득할 수 있습니다. 반드시 350-401부터 응시해야하는 것은 아니며 집중 선택 시험을 우선 합격한 후에 Core 시험에 응시해도 자격은 동일하게 취득할 수 있습니다.

 

 

CCIE

Cisco 에서 주관하는 자격증들 중 가장 상위에 해당하는 네트워크 전문가(Expert)용 자격시험으로 CCNP core와 Concentration Exam을 통과해야 응시 자격이 주어집니다. 현재 코로나19의 영향으로 오프라인 시험장이 확보되지 않아 국내에서의 시험 응시가 불가능한 시험입니다. 응시를 위해서는 해외 지역으로 시험을 직접 보러가야합니다. 합격률이 낮고 투입되는 비용이 큰 시험이기 때문에 상당한 준비가 필요합니다.

 

2. 응시자격

Cisco Certified 관련 자격증들은 CCIE를 제외하고는 별도의 응시자격 제한이 없습니다.

이전에는 CCNA 자격을 취득해야 CCNP 자격시험 응시가 가능했으나 2021년 현재, CCNA 자격 없이도 CCNP 자격시험 응시와 취득이 가능합니다.

 

3. 시험과목

 

CCNA 200-301 (140분)

- 네트워크 기초 (Network Fundamentals)
- 네트워크 액세스 (Network Access)
- IP 연결 (IP Connectivity)
- IP 서비스 (IP Services)
- 보안 기초 (Security Fundamentals)
- 자동화 및 프로그래밍 능력 (Automation and Programmability)

 

CCNP 350-401 (140분)

- 아키텍쳐 (Architecture)
- 가상화 (Virtualization)
- 인프라 (Infrastructure)
- 네트워크 보증 (Network Assurance)
- 보안 (Security)
- 자동화 (Automation)

 

기타 부분에 대해서는 시험 수와 과목 수가 워낙 많기에 Cisco의 자료를 별도로 첨부하겠습니다. 직접 확인하고 싶은 과목의 링크로 들어가셔서 확인해보시면 좋을 것입니다.

 

Cisco Certifications Career Path

4. 합격기준

CCNA 200-301 : 1000점 만점에 825점 이상

CCNP 350-401 : 1000점 만점에 825점 이상

 

5. 시험일정

Pearson Vue 사이트를 통한 상시 온라인 시험으로 진행됩니다.

 

6. 응시수수료와 실시기관 홈페이지

응시료 (2021. 08. 15 기준)

CCNA 200-301 : 300$

CCNP 350-401 : 400$

CCNP Concentration Exam 한 과목 당 : 400$

 

실시기관 및 시험 전반에 대한 안내 : Cisco Learning Network

온라인 응시 가능 자격시험센터 : Pearson Vue

 

7. CCNA, CCNP 자격증을 취득해야하는 이유?

  • 덤프(DUMP)로 높은 합격률 가능
    국제 자격증의 경우 주로 덤프라고 불리는 기출문제를 많이 사용합니다. 이전에 알아본 OCAJP와 OCPJP의 경우와 마찬가지로 CCNA와 CCNP 역시 문제은행식으로 출제되기 때문에 덤프의 효율이 좋은 편이고, 상대적으로 합격률이 높습니다.
  • 상대적으로 긴 자격증 유효기간
    TOEIC등 언어 관련 자격시험은 평균 2년정도인데 반해 CCNA와 CCNP는 3년의 자격 유효기간이 있습니다. 별도의 자격 유효기간이 없는 OCAJP와 OCPJP에 비해서는 단점이 될 수 있지만 필요시마다 쉽게 자격 시험에 응시할 수 있는 환경이므로 만료시점 혹은 만료 후에 언제든지 다시 취득이 가능합니다.
  • 실무에 큰 도움이 되는 자격
    Cisco에서 시스코 장비 임대 계약시 CCNP 자격증 소지자에 임대료 할인을 하는 경우가 있고, 실제로 사용하는 장비를 만드는 Cisco에서 직접 교육, 인증을 진행하는 자격이므로 제대로 공부한다면 바로 실무에서 Cisco 장비를 사용한 네트워크 업무에 적용할 수 있다는 점이 큰 메리트입니다.

최근 전반적으로 큰 폭의 자격증 시험 변경이 있었던 것으로 보입니다. 각종 블로그와 커뮤니티에서의 자료를 조사하다보니 서로 말이 다르거나 부정확한 자료들이 많아서 피어슨뷰를 통해 직접 접수해보고 알게된 정보Cisco 공식 홈페이지에 나와있는 내용만을 토대로 작성했으며 이 외의 내용은 부정확할 수 있어 가급적 제외했습니다.

 

집중시험(Concentration Exam)과 CCIE의 오프라인 테스트 지역 등은 시험 응시를 원하시는 분이라면 직접 홈페이지를 방문하여 다시 꼼꼼하게 확인해보심이 중요할 것입니다. 

반응형
반응형


OCJP (Oracle Certified Java Programmer)

OCAJP (Oracle Certified Associate Java SE 8 Programmer)

OCPJP (Oracle Certified Professional Java SE 8 Programmer)

 

1. 개요

OCJP

Java관련 자격증 중 기초입문 단계에 해당하는 자격 시험으로, Java 프로그래밍 언어 활용 능력을 검증합니다. Java 기술을 개발한 선마이크로시스템즈를 오라클이 인수하면서 자격 시험 명칭도 SCJP에서 Oracle이 들어간 OCJP로 변경되었습니다.

 

지금은 사용되지 않는 자격으로 현재는 OCAJP와 OCPJP로 명칭이 변경, 분화되었으며, 두 과목 모두 Java SE8 버전으로만 시험 응시가 가능합니다.

 

OCAJP

Java 프로그래밍 언어의 활용 능력을 검증하는 자격 시험으로, 시험코드는 1Z0-808 입니다.

 

OCPJP

Java 프로그래밍 언어의 활용 능력을 검증하는 자격 시험으로, OCAJP 자격 취득 후 응시 가능하며 시험코드 1Z0-809 입니다.

 

2. 응시자격

OCAJP

별도의 응시자격 제한 요건이 없습니다.

 

OCPJP

OCAJP 자격 취득자만 시험 응시가 가능합니다.

 

3. 시험과목

 

OCAJP (70문항 150분) - Java 명령어 중심 출제

- Java Basics (Java 기초)
- Working With Java Data Types (Java 데이터 유형 작업) 
- Using Operators and Decision Constructs (연산자 및 의사 결정 구성 사용)
- Creating and Using Arrays (배열 생성 및 작업)
- Using Loop Constructs (루프 구성 사용)
- Working with Methods and Encapsulation (메소드 및 캡슐화 작업)
- Working with Inheritance (상속 작업)
- Handling Exceptions (예외 처리)
- Working with Selected classes from the Java API (Java API에서 선택한 클래스로 작업) 

 

OCPJP (70문항 150분) - Java 고급 및 DB 구축 등 출제

- Java Class Design (Java 클래스 디자인)
- Advanced Java Class Design (고급 Java 클래스 설계)
- Generics and Collections (제너릭 & 컬렉션)
- Lambda Built-in Functional Interfaces (람다 내장 인터페이스)
- Java Stream API (Java 스트림 API)
- Exceptions and Assertions (예외 및 검증)
- Use Java SE 8 Date/Time API (Java SE 8 날짜/시간 API 사용)
- Java I/O Fundamentals (Java I/O 기본사항)
- Java File I/O (Java 파일 I/O)
- Java Concurrency (Java 동시성)
- Building Database Applications with JDBC (JDBC를 통한 데이터베이스 앱 구축)
- Localization (현지화)

 

4. 합격기준

OCAJP : 65%

OCPJP : 65%

 

5. 시험일정

OCAJP, OCPJP는 별도로 정해진 시험 일정 없이 상시로 시험을 접수할 수 있습니다.

합격 여부 또한 시험 종류 직후 확인이 가능합니다. 

6. 응시수수료와 실시기관 홈페이지

응시료 (2021. 8. 10 - Oracle University Voucher 기준)

OCAJP : 292,657원

OCPJP : 292,657원

 

실시기관 및 시험 전반에 대한 안내 : Oracle University

 

전문 교육기관 수강생의 경우 학원 내에서 별도 신청을 통한 응시 가능합니다.

개인준비시 응시 가능 자격시험센터 : Pearson Vue

 

7. OCAJP, OCPJP 자격증을 취득해야하는 이유?

  • 덤프(DUMP)로 높은 합격률 가능
    국제 자격증의 경우 주로 덤프라고 불리는 기출문제를 많이 사용합니다. OCAJP와 OCPJP의 경우에도 마찬가지로 문제은행식으로 출제되기 때문에 덤프의 효율이 좋은 편이고, 상대적으로 합격률이 높습니다.
  • 유효기간이 없이 평생 유지되는 자격증
    OCAJP와 OCPJP는 별도의 유효기간이 없어 자격이 평생 유지됩니다.
  • Java 활용 능력에 대한 객관적인 증명
    Java는 국내 웹 70% 이상의 점유율을 차지하는 것으로 잘 알려져 있습니다. 따라서 Java를 활용하는 회사는 많고 Java 전문가를 채용하려는 공고도 매우 많습니다. OCAJP와 OCPJP는 Java 활용 능력이 있음을 객관적으로 증명할 수 있는 좋은 지표가 됩니다.

반응형
반응형


리눅스 마스터

1. 개요

리눅스 마스터는 리눅스 기반으로 운영되는 다양한 기반기술의 토대가 되는 자격입니다.

 

리눅스 운영시스템의 프로그램 사용능력을 평가하는 2급
리눅스 기반 시스템의 관리능력을 평가하는 1급으로 나뉘어있으며

 

리눅스 마스터 1, 2급은 국가직무능력표준(NCS) 등을 바탕으로 SW기술자의 체계적 역량 가이드라인 IT분야역량체계(ITSQF)의 IT시스템관리자(L5, L3)로 인정됩니다.

2. 응시자격

 

응시자격에 제한이 없어 누구나 시험 응시가 가능합니다.

 

3. 시험과목

등급 과목 검정항목 검정내용
1급 리눅스 실무의 이해 리눅스의 개요 운영체제의 개요, 리눅스 기초
리눅스 시스템의 이해 리눅스와 하드웨어, 리눅스의 구조, X 윈도우, SHELL, 프로세스
네트워크의 이해 네트워크 기초 및 설정
리눅스 시스템 관리 일반 운영관리 사용자·파일 시스템·프로세스·S/W 설치 및 관리
장치 관리 장치의 설치 및 관리, 주변장치 관리
시스템 보안 및 관리 시스템 분석, 시스템 보안 및 관리, 시스템 백업
네트워크 및 서비스의 활용 네트워크 서비스 웹·인증·파일·메일·DNS관리(설치 및 설정), 가상화 관리 및 기타 서비스
네트워크 보안 네트워크 침해 유형 및 특징, 대비 및 대처 방안
2급 리눅스 일반 리눅스의 이해 리눅스의 개요, 역사, 철학
리눅스 설치 기본 설치 및 유형, 파티션과 파일 시스템, Boot Manager
기본 명령어 사용자 생성 및 계정 관리, 디렉터리 및 파일, 기타 명령어
리눅스 운영 및 관리 파일 시스템 관련 명령어 권한 및 그룹 설정, 파일 시스템의 관리
Shell 개념 및 종류, 환경 설정
프로세스 관리 개념 및 유형, 프로세스 Utility
에디터 에디터의 종류, 에디터 활용
소프트웨어 설치 개념 및 사용법, 소프트웨어 설치 및 삭제
장치 설정 주변장치 연결 및 설정, 주변장치 활용
리눅스 활용 X 윈도 개념 및 사용법, X 윈도 활용
인터넷 활용 네트워크의 개념, 인터넷 서비스의 종류, 인터넷 서비스의 설정
응용분야 기술동향, 활용기술

4. 합격기준

 

  • 1급
    - 1차 : 100점 만점 기준, 전과목 평균 60점 이상 + 과목당 40점 이상(과락 시 불합격)
    - 2차 : 100점 만점 기준, 60점 이상
  • 2급
    - 1차 : 100점 만점 기준, 60점 이상
    - 2차 : 100점 만점 기준, 전과목 평균 60점 이상 + 과목당 40점 이상(과락 시 불합격)

 

5. 시험일정

 

6. 합격률

  • 2018년까지의 리눅스 마스터의 합격률은 다음과 같습니다.
연도 자격등급 응시자 취득자 합격률
2018 1급 1,444 105 7.27%
2급 9,690 3,000 30.96%
2017 1급 1,336 350 26.2%
2급 8,303 2,855 34,39%
2016 1급 1,181 241 20.41%
2급 7,742 3,499 45.2%

 

리눅스 마스터는 1, 2급 모두 연도별 응시자 수가 꾸준히 증가하고 있으며 그에 따라 합격률 자체는 소폭 하락하고 있습니다.

 

7.  응시수수료와 실시기관 홈페이지

 

  • 자격증 발급수수료 : 5,800원(배송료 포함)

실시기관 : 한국정보통신진흥협회KAIT

 

8. 코로나19관련 응시제한

 

이 글을 작성하고 있는 2021년 8월 3일 기준 우리나라 코로나 확진자는 1,202명으로 수도권 및 일부지역은 거리두기 4단계, 대부분의 지역은 거리두기 3단계로 지정되어 있습니다.

 

리눅스 마스터 2급 1차의 경우 온라인으로 시험을 치르기 때문에 코로나19 방역수칙으로 인한 사회적 거리두기 단계에 영향없이 시험에 자유롭게 응시가 가능합니다.

 

다만 1급의 1, 2차와 2급 2차의 경우 8개시의 오프라인 시험으로 치러지기 때문에 해당 시험장소가 있는 도시의 사회적 거리두기 단계에 따른 방역수칙이 적용될 것입니다. 자세한 문의는 직접 해보시기를 권장드립니다.

9. 리눅스 마스터 자격증을 취득해야하는 이유?

  • (2급에 한해) 시험의 난이도가 낮은 편
    2급의 1차는 온라인 시험인데다가 문항수에 비해 시간이 넉넉한 편이고, 2차의 경우에도 다른 IT 자격 시험들에 비해 난이도가 높지 않은 편으로 알려져 있어 취득이 용이합니다.
  • 학점은행제 인정
    리눅스 마스터 1급의 경우 14학점, 2급의 경우 5학점으로 인정됩니다.
  • 대학교 내 학점, 졸업 인증 혹은 장학금 지급
    지정된 일부 대학교의 경우 리눅스 마스터 자격증을 취득한 경우에 학점이나 졸업 인증 그리고 장학금 지급에 반영되고 있습니다.

리눅스 마스터는 현업에서 자주 사용하는 리눅스에 대한 전반적인 이해도를 증명할 수 있는 자격증입니다. 자격증을 취득하는 것에만 중점을 두기보다 실제로 현업에서도 사용할 수 있도록 실제 리눅스 실력을 끌어올린다면 리눅스 마스터 자격증이 소프트웨어 개발에도 큰 날개를 달아주지 않을까 생각해봅니다.

반응형
반응형

Go Lang에서는 동시에 실행되는 작업을 Go Routine이라고 부릅니다.

 

다른 프로그래밍언어에서 쓰레드(Thread)라고 부르는 것과 유사한 개념이지만, Go Routine은 OS 쓰레드와 1 대 1로 대응되지 않고 훨씬 적은 OS 쓰레드를 사용합니다. 따라서 한 번에 더 많은 Go Routine을 실행할 수 있습니다.

 

Go Routine은 사용하기도 매우 간편합니다.

 

go 함수명()

 

동시성(Concurrent)은 싱글 코어의 경우에서 스레드를 여러 개 만들어서 마치 동시에 실행되는 것'처럼' 보이도록 하는 것입니다.

 

병렬성(parallel)은 멀티 코어에서 실제로 나눠서 작업을 동시에 처리하는 것을 말합니다.

 

동시성을 구현하기 위해 사용되는 개념이 멀티프로세싱과 멀티쓰레딩입니다.

프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이며, 쓰레드는 프로세스가 할당받는 자원을 이용하는 실행의 단위를 말합니다.

 

동시성을 지원하도록 작성된 프로그램은 여러 작업을 동시에 실행하는 병렬성도 지원할 수 있습니다. 이를 통해 프로그램의 속도를 크게 향상시킬 수 있습니다.

 

예제. 고 루틴 사용해보기

 

package main

import (
	"fmt"
	"time"
)

func printa() {
	for i := 0; i < 10; i++ {
		fmt.Print("A")
	}
}

func printb() {
	for i := 0; i < 10; i++ {
		fmt.Print("B")
	}
}

func printc() {
	for i := 0; i < 10; i++ {
		fmt.Print("C")
	}
}

func main() {
	go printa()
	go printb()
	go printc()
	time.Sleep(time.Second)
	fmt.Println("\nGo Routine End")
}

 

출력결과물

 

BCCCCCCCCCCBABBBBBBBBAAAAAAAAA

Go Routine End

 


출력결과물이 함수 위치순서대로가 아니라 뒤섞여있는 이유는, Go Routine을 통해 세가지 함수가 동시에 실행되기 때문입니다. 따라서 출력결과물은 실행시킬 때마다 매번 조금씩 다르게 나타나실 겁니다.

 

CPU를 최대한 활용하려면 runtime.NumCPU()를 사용합니다.

 

예제. 고 루틴 runtime 활용하기

 

package main

import (
	"fmt"
    "runtime"
	"time"
)

func printa() {
	for i := 0; i < 10; i++ {
		fmt.Print("A")
	}
}

func printb() {
	for i := 0; i < 10; i++ {
		fmt.Print("B")
	}
}

func printc() {
	for i := 0; i < 10; i++ {
		fmt.Print("C")
	}
}

func main() {
	fmt.Println(runtime.NumCPU())
	runtime.GOMAXPROCS(runtime.NumCPU())

	go printa()
	go printb()
	go printc()
	time.Sleep(time.Second)
	fmt.Println("\nGo Routine End")
}

 

 

출력결과물

 

12
AAAAAAAAAABBBBBBBBBBCCCCCCCCCC
Go Routine End

 

go 1.5 버전 이상부터는 runtime.GOMAXPROCS()를 따로 설정하지 않으면 모든 CPU를 활용하는 것이 기본입니다.

runtime.GOMAXPROCS(4) 등을 통해 활용 CPU의 수를 조절합니다.

반응형
반응형

개인적으로 필요해서 정리하는 김에 블로그에 공유해봅니다.


정보처리기사

1. 개요

정보처리기사는 과학기술정보통신부에서 주관, 한국산업인력공단에서 시행하는 소프트웨어 개발 관련 국가자격 시험입니다.
정보시스템의 생명주기 전반에 걸친 프로젝트 업무(계획수립, 분석, 설계, 구현, 시험, 유지보수, 운영) 수행 능력을 검증합니다.

 

국가직무능력표준(NCS)에 맞춰 2020년 시험부터 난이도 등의 큰 개편이 있었습니다.

 

  • 필기 (과목 전체의 변경)
    기존 : 정보시스템 전반 이론
    변경 : 소프트웨어 설계, 구축, 활용

 

  • 실기 (과목, 형식은 동일)
    기존 : 정보시스템 계획 수립, 업무 및 시스템 분석
    변경 : 필기 전 과정을 실무로 작업해볼 수 있도록 구성

정보처리기사는 1년에 3번의 시험이 실시됩니다.

 

2. 응시자격

  • 동일 및 유사 직무분야에서 4년 이상 실무에 종사한 사람
  • 4년제 대학 학사 이상 졸업자(혹은 졸업 예정자)
  • 고졸, 전문학사의 경우 학점은행제 106학점 이수자

 

3. 시험과목

정보처리기사의 시험과목은 위에서도 언급한 바와 같이 2020년 1월 1일부터 국가직무능력표준(NCS)를 기반으로 개편 시행되고 있습니다.

  • 필기 : 객관식 4지 택일형, 과목당 20문항(30분씩)
  • 실기 : 필답형 (2시간 30분)

 

4. 합격기준

  • 필기 : 100점 만점 기준, 전과목 평균 60점 이상 + 과목당 40점 이상(과락 시 불합격)
  • 실기 : 100점 만점 기준, 60점 이상

 

5. 시험일정

다음은 2021년 기준 시험일정입니다. 올해의 3회 시험 접수는 모두 끝났고 접수를 못하셨거나 수험계획중이신 분들은 내년을 목표로 열심히 준비해보도록 합시다!

 

구분 필기원서접수 필기시험 필기합격 실기원서접수 실기시험 최종발표
정기 기사 1회 2021.01.25 ~ 2021.01.28 2021.03.07 2021.03.19 2021.03.31 ~ 2021.04.05 2021.04.24 ~
2021.05.07
2021.06.02
정기 기사 2회 2021.04.12 ~ 2021.04.15 2021.05.15 2021.06.02 2021.06.14 ~ 2021.06.17 2021.07.10 ~
2021.07.24
2021.08.20
정기 기사 3회 2021.07.12 ~ 2021.07.15 2021.08.14 2021.09.01 2021.09.13 ~ 2021.09.16 2021.10.16 ~
2021.10.29
2021.11.26

 

6. 합격률

시험에서 수험생들이 가장 관심을 가질 수 밖에 없는 것이 합격률입니다.

다만, 정보처리기사는 1977년 시작되어 현재까지 매우 오랜 역사를 가진 시험입니다. 그동안 수험내용과 난이도에 많은 변화가 있었으므로 모든 합격률을 확인하기보다 최근 3개년 정도 수준의 합격률을 확인해보는 것이 합리적일 것입니다.

 

물론, 2020 이후의 개편이 있었으므로 2020년 합격률만 보는 것도 무방하지 않을까 생각해봅니다.

 

종목명 연도 필기응시 필기합격 합격률 실기응시 실기합격 합격률
정보처리기사 2020 43,279 24,820 57.3% 41,457 7,341 17.7%
정보처리기사 2019 52,845 30,740 58.2% 43,763 22,495 51.4%
정보처리기사 2018 44,665 22,976 51.4% 33,101 16,727 50.5%

2020년 개편 이후에 실기 합격률이 그 직전 해인 2019년에 비해 현격하게 줄어든 것을 확인할 수 있습니다.

실기 시험의 경우 특히, 더 준비에 신중을 기할 필요가 있어보입니다.

 

7. 응시수수료와 실시기관 홈페이지

  • 필기 : 19,400원
  • 실기 : 22,600원
  • 실시기관 : 큐넷(Q-net)
 

Q-net 자격의 모든것

 

www.q-net.or.kr

8. 코로나19관련 응시제한

이 글을 작성하고 있는 2021년 8월 1일 기준 우리나라 코로나 확진자는 1,442명으로 수도권 및 일부지역은 거리두기 4단계, 대부분의 지역은 거리두기 3단계로 지정되어 있습니다.

따라서 현재 국가자격 시험의 응시에도 이 코로나19 방역수칙을 엄격하게 적용하고 있습니다. 코로나19 확진자는 연 2회 이상 시행하는 국가자격시험에 응시가 제한되고 있으며 시험 접수 후 확진 판정을 받아 입원치료 중인 수험생의 경우 환불조치를 받고 있으며, 해당하시는 분들께서는 자세한 사항을 실시기관에 직접 문의해보시길 권장드립니다.

9. 정보처리기사 자격증을 취득해야하는 이유?

  • 비전공자에게 기본적인 SW 능력에 대한 증빙자료로서의 역할
    정보처리기사 자격은 개발자를 준비중이거나 비전공자인 경우 이력서 등을 통해 회사에 본인이 소프트웨어 능력을 어느정도 갖추고 있는지를 대외적으로 증빙해줄 수 있는 공인자격증의 역할을 합니다

 

  • 정부 발주 프로젝트 참여에 필요한 자격요건으로서의 역할
    기업에서 정부 발주 프로젝트를 수주하려할 때 일정 수 이상의 정보통신관련 자격증보유자를 필요로 하는 경우에 중요한 역할을 할 것입니다.

 

  • 기업에서 정보처리기사 자격증을 가진 인재를 원하는 경우
    IT기업들은 정보통신공사업으로 회사를 신고하려면 일정이상 기술자격증을 가진 인력이 필요한데, 이러한 경우에 자격증이 있는 인재를 채용하기를 원하는 것은 당연할 것입니다.

 

  • 기업에서 해당 자격에 대한 수당을 주는 경우
    많은 기업들이 기사자격증을 보유한 직원들에 대해 추가 수당을 지급합니다. 💰

 

  • 투입되는 노력에 비해 괜찮은 아웃풋
    2020년 개편으로 인해 난이도가 대폭 상승했다고는 하나 투입되는 노력에 비해서 합격 후의 대우가 괜찮다고 합니다.

정보처리기사 자격증은 수많은 IT 자격증 중 가장 유명하고, 대중적인 자격증 중 하나입니다.

 

저 또한 이번 정기 시험 3회 필기시험을 접수했고, 응시할 준비를 열심히 하고 있습니다! 이전에 비해 난이도가 많이 올라갔다고 하고, 또 그것이 합격률이라는 지표로 나타나고 있어 걱정되지만 한 번에 꼭 함께 합격하길! 그리고 취득을 고민하거나 계획중이신 분들도 이번 포스트가 큰 도움이 되셨길 바랍니다!

반응형
반응형


인터페이스를 알아보기 앞서 우선 객체지향 프로그래밍(OOP)에 대해 먼저 알아보도록 하겠습니다. 도움이 될 것입니다.

 

OOP(Object-Oriented Programming)는 프로그램 설계방법론의 하나입니다. 프로그램을 수많은 객체(Object)들로 나누고 이 객체 간의 상호작용을 통해 서술해나가는 방식을 말합니다. 대중적으로 많이 쓰이는 Java, Python, 그리고 Go Lang이 여기에 해당됩니다. 

 

OOP는 유지보수가 쉽고, 코드가 간결해지는 등 많은 장점을 가진 방식이지만,

처리 시간이 오래 걸리고 무엇보다 프로그램 설계 단계부터 꼼꼼하게 생각하고 작성해야 문제가 생기지 않는다는 단점 또한 존재합니다. 알아야할 내용도 많고, 익숙해지는데 많은 시간을 필요로하기도 합니다. 

시간이 지날수록 생기는 여러가지 문제점들을 극복해보고자 Beyond OOP라는 단어가 떠오르기 시작했습니다. 기존의 OOP는 Object 중심이므로 클래스의 갯수가 많고, 이를 처음 작성한 사람이 이직하거나 그만두게 되어 다른 개발자가 온다면 구조를 처음 분석하고 파악하는데에도 많은 시간이 필요로 합니다. 

 

실리콘 벨리와 같은 곳에서는 Make Fast, Break things 라는 말이 유행이었다고 합니다. OOP는 잘 짜여진 구조를 설계하는 것이 매우 중요한데, 시간에 쫓기거나 실력의 부족으로 코드가 꼬이게 되면 기술 부채가 쌓이게 됩니다. 그리고 기술 부채가 쌓이게 되면 언젠가는 프로그램이 무너질 수 밖에 없을 것입니다. OOP를 넘어서야 이 Make Fast, Break things를 실현해낼 수 있습니다.

 

우리는 Go Lang을 통해 Beyond OOP를 실현해내는데 한 발 더 나아가볼 것입니다.


Go Lang의 인터페이스(interface)는 특정 값이 가지고 있기를 기대하는 메소드의 집합, 동작을 수행할 수 있는 타입이 지녀야하는 동작들의 집합입니다.

 

이 Go Lang에서는 인터페이스를 통한 객체의 상태와 기능을 디커플링(Decupling)시켜 object에 종속되어있던 기능을 종속해제합니다. 디커플링을 통해 기존에 OOP의 단점인, 클래스마다 차지하고 있는 기능들이 메모리를 많이 차지하던 문제에서 효율성을 추구할 수 있게 합니다.

 

 

인터페이스의 형태

 

type 인터페이스명 interface {
	메소드명()
	메소드명(매개변수타입)
	메소드명() 반환값타입
}

 

인터페이스 정의에 나열된 모든 메소드를 가진 타입은 해당 인터페이스를 만족한다고 합니다. 인터페이스를 만족하는 타입은 해당 인터페이스가 필요한 모든 곳에서 사용할 수 있습니다.

 

인터페이스를 만족하려면 인터페이스에 정의된 메소드명, 매개변수 타입, 반환값 타입이 모두 일치해야합니다. 인터페이스 정의에 나열된 메소드는 반드시 모두 구현해야하며 하나라도 구현하지 않으면 인터페이스를 만족할 수 없습니다

 

예제. 인터페이스 만들기

 

package main

import "fmt"

type SamHero interface {   // 삼국지 영웅의 행동 세 가지를 인터페이스로 만들어보겠습니다
	Battle()	// '전투' 메소드 작성
	Diplomacy	// 인터페이스도 하나의 타입이므로 인터페이스에 포함시킬 수 있습니다
}

type Diplomacy interface {     // '외교' 인터페이스 안에 동맹과 배신을 만들어줍니다
	Allay()		// '동맹' 메소드 생성
	Betray()	// '배신' 메소드 생성
}

type Hero struct {		// 영웅 구조체를 만듭니다
}

// '전투' 메소드
func (p Hero) Battle() {
	fmt.Println("전투를 개시합니다")
}

// '동맹' 메소드
func (p Hero) Allay() {
	fmt.Println("동맹을 맺습니다")
}

// '배신' 메소드
func (p Hero) Betray() {
	fmt.Println("동맹을 배신합니다")
}

func main() {
	var h SamHero  // 변수 b 선언을 통해 인터페이스를 사용해줍니다
	h = Hero{}	   // 구조체와 연결합니다

	h.Battle()	   // '전투' 메소드 호출

	h.Allay()	   // '동맹' 메소드 호출
	h.Betray()	   // '배신' 메소드 호출
}

 

출력결과물

 

전투를 개시합니다
동맹을 맺습니다
동맹을 배신합니다

 


인터페이스는 비어있는 상태로도 사용이 가능합니다. 말 그대로 빈 인터페이스(Empty interface)입니다.

 

var a interface {}

 

빈 인터페이스는 말 그대로 비어있는 인터페이스이기 때문에 모든 타입의 값을 가질 수 있습니다. 일반적으로는 알 수 없는 값을 처리할 때 사용합니다. 

 

예제. 빈 인터페이스 만들어보기

 

package main

import "fmt"

func main() {
	var a interface{}
	fmt.Println(a)

	a = 3
	fmt.Println(a)

	a = "Mandoo"
	fmt.Println(a)
}

 

출력결과물

 

<nil>
3
Mandoo
반응형
반응형


Go Lang의 메소드란 특정한 구조체에 연결되어 호출되는 함수를 의미합니다. 데이터와 코드를 묶어서 응집도를 높이기 위해 사용하는데, 응집도를 높여서 쓰는 것이 유리한 곳에 활용하기에 좋습니다. (통장 입출금 예제 등)

 

메소드의 형태 (함수와 유사하나 리시버 매개변수 추가 선언 필요)

 

func (리시버매개변수이름, 리시버매개변수타입) 메소드명() 리턴값 {
	구조체 멤버를 접근하여 연산수행 가능
}

 


 

메소드를 호출하기 위해서는 메소드를 호출할 값 다음에 . 을 이용하여 메소드를 붙여주면 됩니다. 이 때 메소드를 호출하는 값을 메소드 리시버(method receiver)라고 합니다.

 

메소드 형태를 참고하면서 다음과 같은 예제를 직접 작성해봅시다.

 

예제. 메소드 입출금 예제 만들어보기

 

package main

import "fmt"

type Account string

func (a Account) withdrawMethod() {
	fmt.Println("인출 메소드 실행 >", a) // 리시버 매개변수의 값 출력
}

func (a Account) depositMethod() {
	fmt.Println("입금 메소드 실행 >", a)
}

func main() {
	withdraw := Account("인출이 완료되었습니다")
	withdraw.withdrawMethod()
	deposit := Account("입금이 완료되었습니다")
	deposit.depositMethod()
}

 

출력결과물

 

인출 메소드 실행 > 인출이 완료되었습니다
입금 메소드 실행 > 입금이 완료되었습니다

 

리시버 매개변수의 이름은 원하는대로 사용하셔도 무방하나 하나의 타입에서 정의하는 모든 메서드는 가급적 동일한 리시버 이름을 사용해 가독성을 높이는 것이 좋습니다.

 


통장 입출금 예제를 사용해서 메소드에 대해 더 자세히 알아보도록 하겠습니다.

 

예제. 통장 입출금

 

package main

import "fmt"

type Account struct {
	balance int
}
	// 인출 함수
func withdrawFunc(a *Account, amount int) {
	a.balance -= amount
}
	// 인출 메소드
func (a *Account) withdrawMethod(amount int) {
	a.balance -= amount
}

func main() {
	a := Account{100} 
	b := Account{200}
	// 인출 함수 사용
	withdrawFunc(&a, 30)
	withdrawFunc(&b, 30)
	// 인출 메소드 사용
	a.withdrawMethod(40)
	b.withdrawMethod(50)

	fmt.Printf("%d, %d", a.balance, b.balance)
}

 

출력결과물

 

30, 120

 

메소드와 함수는 모습은 많이 유사하지만 분명한 차이점이 있습니다. 특히 위의 예제에서 인출 함수와 인출 메소드는 큰 차이가 없어보이도록 구성되어 있습니다.

메소드는 리시버 매개변수를 메소드 이름 앞에 작성해주고 호출할때는 리시버를 활용한다는 점에서 함수와의 차이점이 발생합니다.

 

Go Lang에서는 일반적으로 리시버 이름을 (a Account) 혹은 (d Deposit)과 같이 리시버 타입의 첫 번째 문자를 소문자로 사용합니다.

반응형

+ Recent posts