Go를

프로젝트에

적용한다는 것은

안녕하세요 ACT 입니다.

(Agile Core Team)

ACT 핵심 프랙티스
ACT 핵심 프랙티스
ACT 일하는 방식
역할자 설명
DEV
Designer
PM

오늘의 프로젝트

(AS-IS)

Spring3 + Angular2 + mariadb

(TO-BE)

Go + React + mariadb

오늘의 팀원

1. 나는 어떻게 납득될 것인가.
Node.js, Go 기반 지도 API 발표.
생각보다 어렵지 않았다

성능은 더 좋았다

고민만 했다간 30년 걸려도 못하겠더라.(출처 : the300)

팀의 속도에 어울리는 좋은 인력들(프로필 사진)을 보고 확신
2. 남을 어떻게 설득할 것인가
성능, 성능, 성능 (출처 : 나무위키)

소스코드 재작성은 악이 아니다.
http://docs.likejazz.com/software-engineering-at-google/
마법의 단어
마이크로 서비스, SAAS, RESTful...

Legacy - 해치지 않아요.

strangler pattern

3. 팀원들과 확신하기
Mob Programming

한 사람 정도는 미리 해본 사람이 있는게 심정적으로는 도움이 되더라

성능의 문제는 팀원들을 설득하는 데에는 크게 작용하지 않더라 - 좋겠죠 뭐.

정말로

stack

web framework

gorilla vs revel

Test Suite

unit test & Mock Test - GoMock, MockGen

ORM

IDE - Gogland

Glide - Package Manager

DevOps

At a glance

원격 빌드 설정

빌드 설정


Service start
nohup $(cd /home/ubuntu; ./golangZ) &
echo $! > $PID_PATH_NAME
#->빌드로 만들어진 파일을 실행시키고 종료를 위해 PID를 기록해둔다.


Service stop
sudo kill -9 $PID;
#-> PID를 가지고 프로세스를 kill시킨다.
  				

Dev 관점에서 본 Java vs Go

사실 우리의 첫 선택은..

React + SpringBoot

Go 단순함

Java Keyword : 50

Go Keyword : 25

Duck Typing

만약 어떤 새가 오리처럼 걷고,
헤엄치고, 꽥꽥거리는 소리를 낸다면
나는 그 새를 오리라고 부를 것이다.

간단한 Rest API 개발

#### Java Rest API ```java @RestController public class HelloController { @Autowired private HelloService service; @GetMapping(value = "/hello") public String sayHello() { return "Hello" + service.getName(); } @PostMapping(value = "/hello/{name}") public Hello hello(@PathVariable(value = "name") String name) { return service.saveHello(name); } } ```
#### Go Rest API ```go import ( "github.com/gorilla/mux" "encoding/json" "net/http" ) func InitRouting(r *mux.Router) { r.HandleFunc("/entities", GetHandler).Methods("GET") } type HelloHandler struct { service Service } func (h *HelloHandler) GetHandler(w http.ResponseWriter, r *http.Request) { name := h.service.GetName() w.Header().Set("Content-Type", "application/json") j, _ := json.Marshal("Hello " + name) w.Write(j) } ```
#### Java Rest API Test ```java @RunWith(SpringRunner.class) @WebMvcTest(HelloController.class) public class HelloRestControllerTest { @Autowired MockMvc mvc; @MockBean HelloService serviceMock; @Test public void whenCallHelloApi_thenReturnHelloMessage() throws Exception { given(serviceMock.getName()).willReturn("Kihoon"); mvc.perform(get("/hello")) .andExpect(status().isOk()) .andExpect(content().string("Hello Kihoon")); } } ```
#### Go Rest API Test ```go func TestHelloHandler_GetHandler(t *testing.T) { ctrl := gomock.NewController(t) mockService := NewMockService(ctrl) mockService.EXPECT().GetName().Return("Kihoon") handler := HelloHandler{mockService} req, _ := http.NewRequest("GET", "/hello", nil) recorder := executeRouter(handler, req) assert.Equal(t, "Hello Kihoon", recorder.Body.String()) } ```

프로그래밍 언어 순위

https://www.tiobe.com/tiobe-index/

Dev end..

PM thing

눈에 보이는 것들
Lead Time ( ACT avg = 2d )
Velocity ( 등짝 말고 추세를 보자 )
Test Coverage ( ACT avg = 88% )
Code Coverage
사용자 스토리가 상세해 짐. - 모두가 이해 못하는 상황을 만들 수 없으니까.

마무리

대체재 vs 보완재

팀이 결정할 것.

Q & A