처음 배우는 엘릭서 프로그래밍 5장 연습문제 풀이

처음 배우는 엘릭서 프로그래밍 책에 포함된 연습문제에 대한 풀이를 공유합니다.

문제 5-2, 5-3 이고 조건문을 사용하지 않고 FizzBuzz를 구현하는 방법입니다.

# 5-2 인자 세 개를 받는 함수
fizz_buzz = fn
0, 0, _ -> "FizzBuzz"
0, _, _ -> "Fizz"
_, 0, _ -> "Buzz"
_, _, a -> a
end
# 5-3 FizzBuzz 함수
fizzbuzz = fn
n -> fizz_buzz.(rem(n, 3), rem(n, 5), n)
end
IO.puts fizzbuzz.(10)
IO.puts fizzbuzz.(11)
IO.puts fizzbuzz.(12)
IO.puts fizzbuzz.(13)
IO.puts fizzbuzz.(14)
IO.puts fizzbuzz.(15)
IO.puts fizzbuzz.(16)
view raw 5-FizzBuzz.exs hosted with ❤ by GitHub

처음 배우는 엘릭서 프로그래밍 2장 연습문제 풀이

처음 배우는 엘릭서 프로그래밍 책에 포함된 연습문제에 대한 풀이를 공유합니다.

# 처음 배우는 엘릭서 프로그래밍 연습문제
# 2-1 다음 중 매칭에 성공하는 식은 무엇일까?
a = [1, 2, 3] # 성공
a = 4 # 성공
4 = a # 성공. 단, a 가 4로 할당되어 있다면
[a, b] = [1, 2, 3] # 실패
a = [[1, 2, 3]] # 성공
[a] = [[1, 2, 3]] # 성공
[[a]] = [[1, 2, 3]] # 실패
# 2-2 다음 중 매칭에 성공하는 식은 무엇인가?
[a, b, a] = [1, 2, 3] # 실패
[a, b, a] = [1, 1, 2] # 실패
[a, b, a] = [1, 2, 1] # 성공. a = 1, b = 2
# 2-3 변수 a에 값 2가 바인딩 되어 있다면 다음 중 매칭에 성공하는 식은 무엇인가?
[a, b, a] = [1, 2, 3] # 실패
[a, b, a] = [1, 1, 2] # 실패
a = 1 # 1로 새로 바인딩 됨
^a = 2 # 성공
^a = 1 # 실패
^a = 2 - a # 실패
view raw 2.exs hosted with ❤ by GitHub

Phoenix Up and Running

Phoenix 는 Elixir 를 위한 웹 개발 프레임워크이다. 피닉스 가이드 문서를 따라서 간단하게 피닉스 웹 서버를 띄운다.

설치

Elixir 설치
brew install elixir

다른 플랫폼의 경우 https://elixir-lang.org/install.html 참조

Hex 설치

Elixir 설치가 처음이면 Hex 설치가 필요하다. Hex 는 Erlang 에코시스템의 패키지 매니저이다.

mix local.hex

mix 는 Elixir 의 빌드 도구이다.

Mix is a build tool that ships with Elixir that provides tasks for creating, compiling, testing your application, managing its dependencies and much more

Phoenix 생성기 설치

Phoenix 프로젝트를 생성하기 위해 다음의 명령 실행. Phoenix 생성기를 설치한다.

mix archive.install hex phx_new

프로젝트 생성

hello 라는 이름의 Phoenix 프로젝트를 만든다.

mix phx.new hello

데이터베이스를 사용하지 않을 것이라면 –no-ecto 옵션을 추가한다. Ecto 는 Elixir 를 위한 데이터베이스 래퍼와 쿼리 생성기이다.

Fetch and instll dependencies? 를 Y 로 넘어가면 다음과 같은 결과를 얻을 수 있다.

Fetch and install dependencies? [Yn] Y

* running mix deps.get
* running mix deps.compile

We are almost there! The following steps are missing:

    $ cd hello

Then configure your database in config/dev.exs and run:

    $ mix ecto.create

Start your Phoenix app with:

    $ mix phx.server

You can also run your app inside IEx (Interactive Elixir) as:

    $ iex -S mix phx.server

프로젝트 폴더로 이동 한 다음 ecto 설정을 실행한다.

cd hello
mix ecto.create

ecto 명령어 실행 중 에러가 발생하면 다음 문서를 참고한다.

postgresql 을 처음 설치했다면 role 이 없어서 오류가 발생한다. psql 에서 다음 명령어를 실행한다.

=# CREATE ROLE postgres LOGIN CREATEDB;

실행

모두 완료가 되었다면 Phoenix 서버를 실행한다.

mix phx.server
[info] Running HelloWeb.Endpoint with cowboy 2.9.0 at 127.0.0.1:4000 (http)
[info] Access HelloWeb.Endpoint at http://localhost:4000

위와 같은 로그를 확인했다면 127.0.0.1:4000 에서 첫 화면을 확인.

완료!

소프트웨어 아키텍처 101 자율 평가 문제 – 6장 아키텍처 특성의 측정 및 거버넌스

소프트웨어 아키텍처 101 내용 중 자율 평가 문제에 대한 제가 생각하는 답을 정리했습니다. 책에서 가르쳐준 내용을 토대로 최대한 정답이라고 생각하는 내용을 적었으나 잘못 정리 했거나 틀린 답을 적었을 수 있습니다. 정리한 내용 중 책의 저작권을 위배하는 사항이 있다면 내용이 수정될 수 있습니다.

1 아키텍처를 분석할 때 순환 복잡도가 중요한 메트릭인 이유는 무엇인가요?

순환 복잡도가 증가하면 코드의 모듈성, 시험성, 배포성 등 거의 모든 바람직한 코드베이스 특성을 저해하게 된다.

2 아키텍처 피트니스 함수는 무엇인가요? 아키텍처를 분석하는 데 이 함수를 어떻게 사용하나요?

어떤 아키텍처 특성의 객관적인 무결성을 평가하는 모든 메커니즘

아키텍처 피트니스 함수는 아키텍처가 아키텍처 목표를 달성하는데 얼마나 근접해 있는지를 나타낸다. 테스트 주도 개발에서 각각의 기능들이 얼마나 비즈니스 결과에 부합하는지 확인하기 위해 테스트 코드를 작성해서 확인하는 것 처럼 아키텍처 피트니스 함수를 통해 시스템이 아키텍처 목표에 얼마나 부합하는지 테스트 할 수 있다.

3 아키텍처 피트니스 함수를 이용해서 아키텍처 확장성을 측정하는 예를 들어보세요.

https://youtu.be/ipJtGdmyT-Y

책의 저자 중 한명인 마크 리처즈는 이 영상에서 아키텍처 확장성을 측정하는 방법을 설명하고 있다.

또한 이 글 에서는 다음과 같은 아키텍처 피트니스 함수를 통해 아키텍처 확장성을 측정할 수 있다고 한다.

describe "Performance" do
    it "completes a transaction under 10 seconds" do
        expect(transaction.check_transaction_round_trip_time()).to < 10
    end
    it "has less than 10% error rate for 10000 transactions" do
        expect(transaction.check_error_rate_for_transactions(10000)).to < .1
    end
end

4 아키텍트, 개발자가 피트니스 함수를 생성할 수 있게 하는, 아키텍처 특성의 가장 중요한 기준은 무엇인가요?

아키텍처 특성은 운영적, 구조적, 프로세스 측정 등의 기준으로 측정 할 수 있다.

참고자료

소프트웨어 아키텍처 101 자율 평가 문제 – 5장 아키텍처 특성 식별

소프트웨어 아키텍처 101 내용 중 자율 평가 문제에 대한 제가 생각하는 답을 정리했습니다. 책에서 가르쳐준 내용을 토대로 최대한 정답이라고 생각하는 내용을 적었으나 잘못 정리 했거나 틀린 답을 적었을 수 있습니다. 정리한 내용 중 책의 저작권을 위배하는 사항이 있다면 내용이 수정될 수 있습니다.

1 아키텍처가 지원해야 할 아키텍처 특성의 가짓수를 제한하는 것이 왜 중요한가요?

아키텍처 특성 하나하나는 전체 시스템 설계를 복잡하게 만드는 요인이기 때문에 너무 많은 아키텍처 특성을 수용하면 아키텍트, 개발자가 당초 의도했던 문제 영역의 해결을 시도하기도 전에 아키텍처가 너무 복잡해져버리게 된다.

2 대부분의 아키텍처 특성은 비즈니스 요구사항과 유저 스토리에서 비롯됩니다. 맞는 말인가요, 틀린 말인가요?

많은 아키텍처 특성이 비즈니스 요구사항과 유저 스토리에서 비롯되지만 아키텍트가 알고 있는 도메인 지식에서 도출되는 특성들도 있다. 예를 들어 대학교 학사 관리 시스템의 수강 등록을 처리하는 애플리케이션을 설계한다고 했을 때 학생들의 성향과 습관 상 수강 신청 과정에서 많은 학생들이 마감 직전에 수강 시스템에 몰린다는 것을 알고 있는 아키텍트라면 요구사항 정의서에 탄력성이 적혀 있지 않더라도 탄력성을 도출해 낼 수 있다.

3 비즈니스 이해관계자는 시장 출시 시기(즉, 새로운 기능과 버그 조치 등의 서비스를 가능한 한 신속하게 고객에게 제공하는 것)를 가장 중요한 비즈니스 관심사라고 말합니다. 이런 상황이라면 어떤 아키텍처 특성이 가장 시급하게 지원되어야 하나요?

시장 출시 시기가 중요한 비즈니스 관심사라면 이 시스템은 민첩성, 시험성, 배포성이 시급하게 지원되어야 한다.

비즈니스 요구사항을 시스템에 신속히 적용하는 민첩성이 우선적으로 고려되겠지만 단순히 민첩성만 고려할 것이 아니라 제품 출시와 연관된 여러 특성이 같이 지원되어야 한다. 예를들어 시험성이 떨어지는 아키텍처라면 버그를 조기에 발견하기 어렵고 버그를 발견한다 하더라도 해결 이후에 적절히 해결되었는지 제대로 시험하기가 어렵다. 그러면 버그 조치등의 활동이 전체적으로 느려지게 되고 이는 시장 출시 시기에 부정적인 영향을 주게 된다. 또한 배포성을 제대로 지원하지 않는 아키텍처라면 새로운 기능이 추가 될 때마다 배포 하는 과정에서 많은 시간을 들여야 할 것이기 때문에 시장 출시 시기에 좋지 않은 영향을 줄 수 있다. 따라서 시장 출시 시기가 중요한 비즈니스 관심사라면 민첩성을 비롯하여 시험성, 배포성 등 제품 출시와 연관된 여러 특성을 종합적으로 고려해야 한다.

4 확장성과 탄력성의 차이점은 무엇인가요?

확장성은 유의미한 성능 저하 없이 다수의 동시 유저를 처리하는 능력을 말한다. 확장성이 있는 시스템은 이용자가 꾸준히 늘더라도 추가 이용자를 처리하기 위해 시스템을 변경하거나 추가 리소스를 할당하기 용이한 시스템이다.

반면 탄력성은 트래픽의 폭주하는 정도를 나타낸다. 탄력성의 목적은 할당된 리소스를 지정된 시점에 필요한 실제 리소스 양과 일치 시키는 것이다. 탄력성이 있는 시스템은 갑자기 사용자가 폭증하더라도 사용자 요청을 처리하기 위한 리소스 추가 할당이 적절한 시점에 이루어져 성능 저하 혹은 시스템 다운이 일어나지 않는 시스템이다.

5 고객사가 고객층을 크게 넓히고자 몇 가지 중요한 기업 인수를 추진할 계획이라고 합니다. 여러분은 어떤 아키텍처 특성을 가장 신경 써야 하나요?

기업 인수가 성사된다면 서로 다른 환경에서 만들어진 시스템이 통합 되어야 하는 상황이 일어날 수 있다. 따라서 이와 관련되는 시스템에서는 상호운용성, 확장성, 적응성, 신장성 등의 아키텍처 특성을 고려해야 한다.

참조