서론

공부 할 내용

도메인 모델을 구현하기 위한 기본 내용

  • 1. 도메인 모델이 뭐지? 엔티티와 밸류
  • 2. 아키텍쳐의 영역, DIP pattern, 도메인 영역의 구성 요소

공부 환경

장소: 동대문 할리스

시간: 월요일 퇴근후

향기: 흡연실 바로 앞 목과 폐가 아플 정도의 담배향기

들었던 음악

본론


1. 도메인 모델 시이작!

도메인이 뭐지? 

소프트웨어로 해결하고자 하는 문제의 영역. 

예를 들어 주겠어요? 

  • 온라인 서점은 도메인이고요! 도메인은 주문, 배송, 결제와 같은 도메인으로 나뉩니다. 도메인을 우리가 구현해야할 필요는 없고 외부 pg 연동같이 구성할 수도 있습니다. 


도메인 모델?

특정 도메인을 개념적으로 표현한 . 도메인 자체를 이해하기 위한 개념 모델.

어떻게 모델로 표현하나?

  • 각자 방법에 맞게끔.
  • 객체 모델(클래스 다이어그램) 일수도 있고. 그럼 객체 지향 언어를 통해서 구현하면 편하구..
  • 상태 다이어그램으로 작성할 수도 있고
  • 계산이 중요하다면 수학 공식을 활용해서 function으로 구현하던지
  • 관계가 중요하면 그래프를 이용해도 되고

이해가기 쉽게 표현하는 거시라고 이해했다 ^_^ 

구현 모델은 또 따로 필요하다. 


도메인 모델 패턴

아키텍처는 표현/응용/도메인/인프라스트럭쳐 4개의 계층으로 구성되어있는 것이 일반적, 여기서의 도메인 모델은 PEAA 책에 따르면, 아키텍처 도메인 계층을 객체 지향 기법으로 구현하는 패턴을 뜻함.

, 계층별로 구현해야하냐 인데, 도메인 모델 패턴은 도메인 계층을 어떻게 구현하는지.

도메인 구현 = 도메인의 핵심 규칙 구현

  • e.g., 출고 전에만 배송지를 변경할 있음. 
  • 주문 취소는 배송 전에만 있음


도메인 모델 도출

    요구사항을 정리해서 도메인 규칙을 만들어 다음에 구현한다.


    엔티티와 밸류

    엔티티

    • 식별자를 갖는다.
    • 삭제할때까지 변경하던 식별자는 유지됨
    • 두개 엔티티의 식별자가 같으면 엔티티는 같다.
      • e.g) 주문번호가 같으면 같은 주문임
    • equals(), hashCode() 메소드를 가짐
    • 생성 시점이나 방법은 도메인 특징 별로 다름
      • 특정 규칙을 쓰거나
      • UUID 클래스를 쓰거나
      • 아이디 같이 직접 입력하거나
      • 일련 번호를 쓰거나(mysql aI key..)
        • 생성하기 전에는 식별자 전달 불가

    밸류 타입

    • 개념적으로 완전한 하나를 표현하고자
    • e.g.) 받는 사람 + 주소를 묶어서 Receiver,
    • e.g.2) price 뜻하는 money 타입
    • 장점: 
      • money 위한 기능을 만들 있음. 돈계산같이..!
    • 어떻게 변경하나?
      • 기존을 변경하는게 아니라 새로운 밸류를 생성함.
      • 이뮤터블(불변)
    • 모든 속성이 같은지 비교해야 밸류 객체가 같은지 있음

    엔티티 식별자와 밸류 타입

    • 식별자를 위한 밸류타입을 사용해서 활용 가능

    도메인 모델에 set 넣지말자? ?

    • set 어떤 의미인지 개념이나 의도가 없어진다
    • 생성할때 완전한 상태가 아닐 수도 있다. (생성한담 셋하는데 하나 빼먹으면 어쩔꺼야? 그냥 생성할떄 받아라)
      • 프라이빗으로 생성할때 set시키도록. 외부에서 set 불가하고.. 

    도메인 용어

    • step1, step2 아닌 payMENT_WAITING, PREPAREING 도메인에서 사용하는 용어를 써라


    2. 아키텍쳐 개요

    네개의 영역

    표현

    • 응용에 변환하여 전달하고 받은 응답을 변환하여 웹브라우저에 보여주고

    응용

    • 표현 영역을 통해 받은 처리하기 위한 기능을 구현
    • 구현하기 위해 도메인 영역의 도메인 모델 사용(도메인 모델에 로직 수행 위임)
    • 주문등록, 주문 취소, 상품 상세 조회

    도메인

    • 도메인 모델 구현(1 내용)
    • 배송지 변경, 결제완료, 주문 총액 계산

    인프라

    • 구현 기술에 대한
    • RDBMS, 메시지 , SMTP, REST API… 

    계층 구조 아키텍처

    전형적인 계층 구조상의 의존 관계를 가지면 생기는 문제들(상위 계층에서 하위 계층으로 의존)

    • 테스트 어려움 (인프라 레벨 룰엔진이 완벽하게 동작해야 응용 영역에서 계산을 있음)
    • 기능확장 어려움(구현 방식을 변경하기 어렵다.) 

    DIP

    고수준: 가격 할인 계산 저수준: RDBMS JPA 구현, Drools 적용

    DIP: 저순준 모듈이 수준 모듈에 의존하도록 바꿈. 어떻게? 추상화한 인터페이스로!


    RuleDiscounter라는 인터페이스를 만들어서 고수준은 ruleDiscounter 활용하고, 저수준은 ruleDiscounter 상속받아 구현. 

    쉬워지는 거지?

    • 테스트해본다면? 
      • 저수준 안만들고 대용 객체를 사용해서 테스트 진행 가능 ( 데이터 활용)
    • 구현 기술이 변경된다면?
      • 고수준쪽은 수정안하고 저수준 구현 객체 생성하는 부분의 코드를 변경한다. (ruleDiscounter 생성하는 애만 바꿈..)

    DIP 아키텍처

    ?? 이해는 안가는 여튼 인프라가 응용 쪽의 인터페이스를 상속 받고 있으니 응용 영역 변경할 필요가 없고 notifier 구현하는 클래스를 인프라에다가 추가하면 되니까 깔끔하다는 같다? 

    도메인 영역의 주요 구성 요소

    • 엔티티
    • 밸류
    • 애그리거트
    • 리포지터리
    • 도메인 서비스

    서론

    사내에서 DDD Start! 책으로 스터디를 진행하기로 했다. 정리하지 않으면 또 아무곳에 남지않을 것 같아 블로그에다가 정리해보려고 한다. 

    우선 DDD는 무엇이고 왜 공부하기로 마음 먹었는지부터 정리해본다.


    What, Why and How

    What is DDD(Domain Driven Design)?

    Domain-driven design (DDD) is an approach to software development for complex needs by connecting the implementation to an evolving model.[1] The premise of domain-driven design is the following:

    • placing the project's primary focus on the core domain and domain logic;
    • basing complex designs on a model of the domain;
    • initiating a creative collaboration between technical and domain experts to iteratively refine a conceptual model that addresses particular domain problems.


    왜 DDD를 공부하기로 맘 먹었는가?

    1. 회사에서 MSA할거라고 팀을 도메인별로 나누어 버렸다. 도메인 별 구현을 하려면 알면 좋겠다고 생각했다.
    2. 그냥 공부를 요새 너무 안해서 공부가 필요했다. (뭐든 상관 없다. 일단 공부 좀 해야겠다.)
    3. 선배들이랑 공부해보고 싶어서. 항상 주니어 위주의 스터디를 해왔는데, 답을 내리지 못하는 경우들이 있었다. 시니어들이 많은 스터디여서 어떤 점이 다를까 조금 궁금하기도 했다. 


      어떻게 DDD를 공부할 것인가?

      회사에서는 화, 목 점심시간에 모든 구성원이 세션을 읽어오고, 발표 담당자가 내용을 요약하여 발표한다. 나는 발표담당자가 아녀서 맘이 편하긴 하지만, 편한 맘 만큼 공부를 많이 안할 수 있으니 매주, 내가 공부한 내용들을 정리할 예정이다.  스터디에서 오간 내용들을 모두 올리면 철컹철컹 할 수 있으니.. 대략적인 논쟁거리, 의문사항이 있으면 추가로 작성해볼까 한다. 
      회사에서는 한 시간마다 두 챕터를 나가기로 했는데, 잘 지켜지지 않고는 있다. 
      책의 서론에 보니 책의 내용이 다음과 같이 구성되어있다. 책이 말하는 대로 꼭지를 잡아서 업로드를 올릴까 한다. 올리는 주기는 주에 1회!

      1장, 2장: 도메인 모델을 구현하기 위한 기본 내용

      • 도메인 모델이 뭐지? 엔티티와 밸류
      • 아키텍쳐의 네 영역, DIP pattern, 도메인 영역의 구성 요소


      3장, 4장: 애그리거트와 리포지터리: 애그리거트가 뭐지? 어떻게 구현하지?

      • 리포지터리는 어떻게 구현하지?
      • 리포지터리의 조회 기능을 우리 다같이 구현해볼까?

      5장: 응용 서비스와 표현 영역

      • 지금 까지 만든 도메인 모델은 어떤 역할인데? 응용 서비스가 어떻게 사용할꺼야? 표현 영역이랑 응용 서비스를 어떻게 연결할꺼야?

      6장: 도메인 서비스의 이유와 구현방법

      • 도메인 서비스가 왜 필요하지? 어떻게 구현할꺼지?

      7장, 8장: 애그리거트의 트랜잭션 범위에 따른 구현

      • 선점잠금과 비선점 잠금 구현법

      9장: Bounded context

      • Bounded context가 뭐지? 어떻게 통합하고 관계가 있지?

      10장: 도메인 이벤트와 CQRS

      • 도메인 이벤트 활용법, 처리법 등
      • CQRS가 무엇이고 어떤 효과를 얻을 수 있을까??



      어떤 값이 나와야되는데 안나온다고 오류 수정 요청이 있었다. 수정했는데 되게 어이없는 이유였다. 

      원인은 이거였다.


      테이블 이름이 keyboard이고, qwerty라는 컬럼이 있다고 가정하고, 다음의 쿼리를 날려본다.

      SELECT qwerty FROM Keyboard;

      이렇게 하면 qwerty 칼럼의 내용들을 잘 가지고 올테다. 하지만 만약 다음과 같은 쿼리를 날리면 어떻게 될까?

      SELECT QWERTY FROM keyboard;


      정답은 mysql 대소문자 설정에 따라 다르다. 다음과 같은 쿼리를 날려 보았을때

      SHOW variables LIKE 'lower_case_table_names';

      값이 0인 경우 대소문자를 구분하고, 값이 1인 경우 대소문자를 무시하고, 값이 2인 경우에는 대소문자를 구분하지만 이름 비교에서는 구분하지 않는다. 

      구체적은 설명은 다음과 같다. mysql 가이드에서 그대로 긁어왔다. https://dev.mysql.com/doc/refman/5.6/en/identifier-case-sensitivity.html

      ValueMeaning
      0

      Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or CREATE DATABASE statement. Name comparisons are case sensitive. You should not set this variable to 0 if you are running MySQL on a system that has case-insensitive file names (such as Windows or macOS). If you force this variable to 0 with --lower-case-table-names=0 on a case-insensitive file system and access MyISAM tablenames using different lettercases, index corruption may result.

      CREATE TABLE 혹은 CREATE DATABASE문에서 명시된 대소문자로 데이터베이스명과 테이블명이 디스크에 저장된다. 이름 비교는 대소문자를 구분한다. 만약 우리가 대소문자를 구분하지 않는 파일명을 가지고 있는 시스템(윈도우나 맥 OS) 에서 Mysql을 돌리고 있다면 이 값을 0으로 설정하지 않는 것이 좋다. 만약 우리가 대소문자를 구분하지 않는 파일시스템에서 --lower-case-table-names=0으로 값을 강제로 0으로 만들어 버리고, 다른 대소문자를 사용해서 MyISAM 테이블명에 접근한다면, 인덱스 충돌이 일어날 수도 있다.

      1

      Table names are stored in lowercase on disk and name comparisons are not case-sensitive. MySQL converts all table names to lowercase on storage and lookup. This behavior also applies to database names and table aliases.

      테이블명이 디스크에 소문자로 저장되며 이름 비교는 대소문자를 구분하지 않는다. MySQL은 스토리지와 lookup에 모든 테이블명을 소문자로 전환한다. 이 전환은 데이터베이스명과 테이블 aliase(별칭)에도 적용된다.  

      2Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or CREATE DATABASE statement, but MySQL converts them to lowercase on lookup. Name comparisons are not case sensitive. This works only on file systems that are not case-sensitive! InnoDB table names are stored in lowercase, as for lower_case_table_names=1

      CREATE TABLE 혹은 CREATE DATABASE문에서 명시된 대소문자로 데이터베이스명과 테이블명이 디스크에 저장되나, MySQL이 룩업에 소문자로 전환한다. 이름비교는 대소문자를 구분하지 않는다. 이 값은 대소문자를 구분하지 않는 파일 시스템에서만 동작한다! InnoDB 테이블명은 lower_case_table_names=1 조건처럼 소문자로 저장된다. 

      여튼 나같은 경우에는 대소문자를 구분하지 않도록 설정은 되어있었지만은, 결과를 가지고올때는 qwerty칼럼이 아니라 QWERTY 칼럼으로 값을 가지고 와서, 키매핑을 잘못 시켜준 상황이었다. (나를 qwerty일거라고 생각하고 코드를 짰는데 QWERTY였던..)


      서론

      지금까지 별생각없이 insert statement를 써왔다. 되게 오래걸리는 작업, 크론에서 돌아가야할 애들인 경우에만 의식적으로 bulk insert를 썼다.('bulk' 라는 말 때문이었을까? 뭔가 대용량인 경우에만 써야할 것 처럼 느껴졌다.)

      최근 내가 만든 부분에서 에러로그가 자주 올라오면서 우리 센터장이신 분이 나에게 찾아와 질문하시길... 

      for문 돌면서 insert해요, 아니면 statement 만들어서 insert 해요?

      나는 당당하게! for 돌면서 insert하고 있슴디다^-^ 문제 없습니다. 했는데 문제가 있다고 한다. '엔지니어'라는 직함을 달고있다면 어떤 원리인지 찾아보아야 했을텐데 잘 몰랐어서, 그리고 찾아볼 생각도 없었어서 ㅠ 이제라도 다시 찾아본다. 


      본론

      역시 가장 정확한 정보는 만든 사람들의 가이드가 아니겠는가. insert vs bulk insert와 같은 키워드로 googling을 해보니 쉽게 찾을 수 있는 링크! 내용 중 중요하다고 생각되어지는 부분들을 가지고와 번역해본다. 

      https://dev.mysql.com/doc/refman/8.0/en/insert-optimization.html


      Optimizing INSERT Statements 

      insert 문을 최적화 하기

      To optimize insert speed, combine many small operations into a single large operation. Ideally, you make a single connection, send the data for many new rows at once, and delay all index updates and consistency checking until the very end.

      insert속도를 최적화하기 위해서는, 여러개의 작은 연산을 하나의 큰 연산으로 합쳐라. 이론상으로, 하나의 커넥션을 만들고, 한번에 다수의 행에대한 데이터를 보내고, 모든 index 업데이트,  consistency checking(무결성 체크?)를 끝날때까지 지연시킨다. 


      The time required for inserting a row is determined by the following factors, where the numbers indicate approximate proportions:

      한 행을 insert하는데 필요한 시간은 다음과 같은 요인들에 의해서 결정된다. 숫자는 대락적인 비율을 뜻한다. 

      Connecting: (3)

      Sending query to server: (2)

      Parsing query: (2)

      Inserting row: (1 × size of row)

      Inserting indexes: (1 × number of indexes)

      Closing: (1)

      If you are inserting many rows from the same client at the same time, use INSERT statements with multiple VALUES lists to insert several rows at a time. 

      만약 동일한 클라이언트에서 동시에 여러 행들을 insert하고 있다면, 한번에 여러 행을 insert하도록 insert문을 VALUES 리스트랑 같이 사용해라.

      This is considerably faster (many times faster in some cases) than using separate single-row INSERT statements. 

      이것은 분리된 한행의 insert문을 사용하는 것보다 상당히 빠르다. 



      결론

      사소한 것일지라도, 내가 만든 것이 어떻게 되어있는지 알고 넘어가야겠다는 생각이 들었다. 내가 만든 부분은 한 클라이언트에서 동시에 약 10번의 insert가 개인당 이뤄졌었다. 5000명이 들어왔다고 하면 50000번의 insert가 있었던 거였는데 이걸 2번의 insert로 줄일 수 있었다. 그러면 총 10000번의 insert로 오분의 일로 커넥션을 줄일 수 있었따. 히이익. 자주 몰리는 부분들에 대해 조금 더 고민해 볼 것. 그리고 트랜잭션 레벨에 대해서도 고민해볼 것. 고민할 것이 투성이다. 


      '개발개발 > mySql' 카테고리의 다른 글

      DB를 쿼리로 업데이트 할때  (0) 2018.09.16
      mysql 월/주차 구하기  (1) 2018.01.06
      left join 시 속도 문제  (0) 2016.12.20
      SELECT 정렬하기 정리  (0) 2016.12.13
      order by varchar to int  (0) 2016.11.24

      일을 하다보면.. 그러기 싫지만 강제로 DB에 접속해서 쿼리로 업데이트를 해야할때가 많다.

      그럴때마다 나는 그냥 쫄아있는 상태로 손을 벌벌 떨면서 ... update table set column = 0 where flag = 1; 과 같은걸 날리고 데이터를 확인하고는 했다.

      하지만 그럴때 덜 쫄 수 있는 방법이 있다. 방법은 트랜잭션을 사용하는 것이다. 

      R을 제외한 CUD를 칠때는 다음과 같은 방법을 쓴다.

      1. 정상적으로 작업했을 때 나오는 카운트 수를 본다. 

      select count(*) as c from table where flag = 1;

      그럼 쿼리가 실행되면서 몇건인지가 나온다. 그 몇 건을 봐둔다. 

      2. 다음과 같은 문구를 미리 작성해둔다. 주석도 포함해서

      # start transaction;

      # update table set column = 0 where flag = 1; 

      # rollback;

      # commit;

      3. 주석을 하나씩 풀어가면서 진행한다. 우선 트랜잭션을 실행시킨다. 

      start transaction; (실행)

      # update table set column = 0 where flag = 1; 

      # rollback;

      # commit;

      4. 원래 돌리려고 했던 업데이트 문 실행
      update table set column = 0 where flag = 1; 

      5. 이때 affected rows가 맨 첨에 날린 카운트수와 일치하는지 본다. 시간 차이가 있겠으나 뭐 얼추 비슷한 값이 나올것이다. 

      6. 만약 이상함을 감지했다면 당황하지 않아도 된다. rollback 시키기

      rollback;

      이렇게 하면 내가 update문을 치기 전으로 돌아간다. 트랜잭션을 걸어놓았으니까 말이다. 

      7. 정상적이었다면? commit하기!

      commit;을 실행시켜준다. 그러면 끝이당.

      '개발개발 > mySql' 카테고리의 다른 글

      insert와 bulk insert 무엇을 써야할까요?  (1) 2018.10.04
      mysql 월/주차 구하기  (1) 2018.01.06
      left join 시 속도 문제  (0) 2016.12.20
      SELECT 정렬하기 정리  (0) 2016.12.13
      order by varchar to int  (0) 2016.11.24

      아니 왜 되던게 안되는거야?

      ajax 처리를 할때 beforeSend에다가 코드를 작성해주면, request를 보내기 전에 작동한다. 난 요청을 보낼때 로딩을 달거나, 화면을 까맣게 만들어 request를 여러번 날리는 걸 막는데에 활용해오곤 했다.(가장 의도와 맞는 사용법은 언제나 jquery)
      잘쓰고 있었는데 어느날 얘가 또 안되기 시작했다. 아래와 같이 코드를 돌렸다. 
      /*소스 코드는 http://api.jquery.com/jquery.ajax/ 에서 퍼왔다. 안돌아가는 예임 */
      $.ajax({
        url: "https://fiddle.jshell.net/favicon.png",
        beforesend: function( xhr ) {
          xhr.overrideMimeType( "text/plain; charset=x-user-defined" );
        }
      }).done(function( data ) {
          if ( console && console.log ) {
            console.log( "Sample of data:", data.slice( 0, 100 ) );
          }
        });

      이렇게하면 beforesend가 안먹는다. 


      왜냐하면 beforesend가 아니라 beforeSend니까!!!!!!! 

      아래처럼 하면 돌아간다. 

      /*소스 코드는 http://api.jquery.com/jquery.ajax/ 에서 퍼왔다.  */
      $.ajax({
        url: "https://fiddle.jshell.net/favicon.png",
        beforeSend: function( xhr ) {
          xhr.overrideMimeType( "text/plain; charset=x-user-defined" );
        }
      }).done(function( data ) {
          if ( console && console.log ) {
            console.log( "Sample of data:", data.slice( 0, 100 ) );
          }
        });

      그리고 beforeSend안에 있는 함수가 return false를 내뱉으면 request가 취소되는 것을 명심해야한다. 아! 또 async:false 달아둬서도 안된다. 


      오늘도 너무 보람차고 수치스러운 하루였다 :-> 

      뭘 하려고 했었냐면..

      다른 사람이 올려놓은 브랜치를 remote 서버에서 체크아웃해서 돌려보고 싶었다. 체크아웃쯤은 cheatSheet 보지 않아도 알G알G 하고 이렇게 했다.
      git checkout feature-shoveling
      error: pathspec 'feature-shoveling' did not match any file(s) known to git.
      
      오래 헤매진 않았지만 sourceTree 같은 툴에 너무 익숙해지다 보니까 터미널로 해결하는 법을 깜박해버렸다. 원인은 remote 의 git에 접속한지 오래 되어 fetch를 받지 않은 것^ㅅ^@@@ 
      당황하지 말고 머쓱해하며 다음 명령어를 쳐주자.
      git fetch
      git checkout feature-shoveling
      
      이렇게 하면 된당. ^-^


      뭘 하나 샀다!

      Ta-da! BubbleSort zines에서 잡지(?)를 하나 구매했다. BubbleSort zine 시리즈는 고등학생 수준으로, 낙서와 그림이 가득한 얇은(58페이지 가량) 컴퓨터 과학 잡지이다.  "How Does The Internet?" 편을 구매했다. 사게된 이유는 저자의 어떤 포스트가 너무나 감명깊었기 때문이다. 

      재밌는 걸 읽었다. 

      Medium에서 sailor mercury라는 이름의 프로그래머가 작성한 포스트를 읽었다. 제목은 Art and Math and Science, Oh My! 최근 읽은 글 중 가장 감명 깊었다. 포스트의 내용을 간략히 요약하자면 이렇다. 

      어떤 내용이었냐면......!

      sailor mercury는 자라면서 예술을 사랑했고 과학도 사랑했다. 그리고 두 분야에 모두 재능이 있었다. 

      예술과 과학은 서로 연관이 없는 것처럼 느껴졌다. 인생에서 뭘 해야할지 결정할 시기가 오자, 두가지 중에 무엇을 선택해야만하나 고민하다 결국 MIT 공대에 진학했다. 대학에 와서도 여전히 강의를 들으며 그림을 그렸다. 다른 친구들처럼 주말에 사이드 프로젝트를 하지 않는 자신이 이상하게 느껴졌다. 예술 그리고 과학, 서로 다른 두가지를 똑같이 좋아하는 자신이 이상하게 느껴졌다. 

      그러다, 그런 자신을 보고 절친한 친구가 이렇게 말했다고 한다. 

      "I think that the unifying thing about all of your interests is that you really like creating and making things, whether that’s a painting or a program." 

      내 생각에 네 모든 관심사를 통틀을 수 있는건 너가 창조하고 무언가를 만드는걸 정말 좋아한다는 거야. 그게 그림이던, 프로그램이던간에 상관없이.. 

      그 후, 예술과 과학을 이분법적으로 생각하지 않았다. 예술과 과학이 서로 어떻게 연결되어있는지 탐구했다. 

      디자인은 기술을 사용가능(usable)하게 만들어준다. 

      예술은 수학과 과학을 배우기 쉽게 만들어준다. mercury도 그런 관점에서 그림과 만화가 가득한 Bubblesort Zines(이 시리즈 중에 하나를 구매했다 :D )) 를 쓰기 시작했다. 

      예술은 과학에 영감을 불어넣는다. mercury가 만나온 대부분의 동료들이 그렇다. 도라에몽을 사랑하고, 도라에몽처럼 멋진 도구들을 만들고 싶어서 엔지니어에 대한 꿈을 키웠다. 아톰을 보고 로봇을 연구하게 된 동료들이 대부분이다. 

      또, 과학은 예술을 우리 일상으로 끌어와준다. 앙리 마티스의 조형을 경험할 수 있도록 자바스크립트로 구현한 사이트 처럼. (또 그냥 포스트와 상관없이 webcam으로 움직임을 감지해 실시간으로 노래를 만들어내는 https://jeonghopark.github.io/scanseqjs/ 이거 멋있다.) 

      여튼 그래서 결국, 과학과 예술을 분리하지 말자는 게 mercury의 말이었다. 그 둘을 분리해버리는 것은 둘 다에 관심있는 사람이 하나를 포기하게끔 만들고 좌절시킨다(mercury처럼). mercury가 들어왔던 art class. science class. 에서 끝나는 것이 아닌, 예술이 있는 과학 수업 혹은 과학이 있는 예술 수업을 상상해보자. 셜록 홈즈에 나온 화학 작용들을 알아보는 화학 수업처럼.

      과학과 예술은 "함께" 세상을 더 나은 곳으로 만든다. 

      라는 내용이었다. 

      내가 감명깊었던 이유는

      나름 열심히 요약해보았는데, 내 글은 재미가 없다. 그 자체로 예술의 중요성을 명백히 나타내는 것 같다. 저 포스트에는 따뜻하고 아기자기한 그림들이 넘치고, 여기에는 없다. 텍스트로 온전히 생동감을 전달할 수 없다. 

      mercury의 말대로 우리는 특별히 하나를 잘하는 것을 가치있게 여기는 사회에서 살고있다. 그리구 나도 그런 사람 중 하나. 딱 한가지를 잘하는 사람이 줄곧 되어오고 싶었다. 하지만 난 별로 그런 사람도 아니고, 딱 한가지만을 잘하지 않고, 한가지에만 관심이 있지도 않다. 주말이 올 때마다 "아 내가 프로그래밍 너드면 얼마나 좋을까" 상상해왔지만.. 어쩔 수 없다. 난 프로그래밍 너드는 아니다. 

      프로그래밍을 직업으로 삼게 된 건 분명 즐거웠던 순간이 있었기 때문이다. 하지만 이걸 직업으로 삼고나서는 즐거운 순간을 잊어버린 것 같다. "학습", "끊임없는 공부", "사이드 프로젝트" 이런 말들에 겁에 질려 재밌는 순간은 잊어버리고 "해야하는데"라는 생각으로 가득 차 압박만 받아온 것 같다. 

      프로그래밍이 즐거웠던 이유는 생각이 코드가 되고, 그 코드가 동작해서 구현이 되었을 때의 "창조"하는 기분이 좋아서. 그리고 생각한 것을 만들어 내는게 신기하고 좋아서. 내가 수학공식으로 첫 응용문제를 풀어내었을 때처럼, 마치 퍼즐을 푸는 것 같은 쾌감이 들어서. 여러가지 즐거운 이유가 있었다. 

      프로그래머의 덕목들을 다 갖추지 못한 나를 조금 미워해왔다. 그치만, 프로그래머의 덕목이라고 불리진 않을지라도 다른 덕목들을 갖추고 있다. 많지는 않지만 앞으로 더 많이 찾을 수 있으리라 생각한다.

      예술을 좋아한다. 감성 넘치는 순간들을 사랑한다. 다른 사람들이 보았을 때 마음이 따뜻해지는 작업을 하고 싶다. 소스 코드에 다정하지만 명쾌한 주석을 달고 싶다. 사용자들의 마음이 노곤노곤해지는 서비스를 만들고 싶다. 작고 소소한 귀여움을 숨겨둔 서비스를 만들어보고 싶다. 


      '개발개발' 카테고리의 다른 글

      DDD Start! 정말?  (0) 2018.11.20
      MR과 PR의 차이  (0) 2018.03.04
      개발 공부하기 좋은 유용한 사이트 정리  (0) 2017.10.09
      개발을 잘하고 싶다.  (0) 2016.06.26

      JAVSCRIPT return; return false; return null;


      (김영보님의 자바스크립트 강의를 듣고있다. 자바스크립트를 아예 모르는 웹개발자는 모순인것같다. 나도 이래저래 필요한 기능들은 검색을 통해 꾸역꾸역 만들 수는 있다만 '잘' 만들지 못한다. 잘 만드는 것에 대해서 고민해보았음한다. 내 스스로가..)


      수업시간에 들었던 return 에 대해서 정리한다.  


      return이란 무엇인가?

      '반환시켜주는 것' 이다. 무엇을 반환하는 가? 하면  “표현식의 평가” 결과를 반환하는 것이다. 

      return과 표현식을 한줄에 연결하여 작성한다. 자바스크립트는 세미콜론을 작성하지 않아도 엔진이 자동적으로 세미콜론을 삽입한다. 

      그러니까 return \r\n true; 하게 되면 return;를 반환하게 되는 불상사가 일어날수도 있다. 


      return; 

      표현식을 작성하지 않으면 undefined를 반환함(return; ) 아무것도 반환하지 않는것이 아니라, undefined를 반환한다. 

      a 라는 변수가 선언된 적이 없었다면

      return a; 는 return;과 동일한 의미를 가지게된다. 


      return false, return null, return; 이거 다 같은걸까? (나는 솔직히 그동안 같은 의미로 사용할때가 많았다. return 에 큰 의미를 두지 않았다. 그냥 중간에 탈출하는 용도로만 사용했지..). 

      null과 false는 의도적으로 넘긴 것이다. return;은 undefined 된것을 의미한다. 

      받아쓰는 입장에서는 이 세개를 분리해서 사용해야한다. 



      + Recent posts