반응형

기존에 사용하고 있던 넷북을 서버로 켜놓을까 하다가 항상 켜놓을 수 없고 매일 사용할때마다 코드 꼽고 하는 작업이 번거로웠다. 그리고 SSH로 접속을 해보았는데 좀 느려서 써먹기는 좀 힘들어 보였다. 그래서 AWS 에 가상 서버를 한번 만들어서 써보자는 생각이 들었다. 어차피 프리티어 기간에는 어느정도 수준 까지는 공짜로 사용할수 있으니 딱 좋았다. 그리고 예전에 AWS 세미나 갔을때 받았던 크래딧도 있어서 이 기회에서 써봐야 겠다고 마음먹었다.




먼저 아마존 Console Home 에서 EC2 를 클릭하고 나오는 화면에서 Create Instance 밑에 있는 Launch Instance 를 클릭한다. 



여기에서는 AWS 에서 만들 가상 서버 종류를 선택할 수 있다. 서버 아래에 보면 "Free Tier Eligible" 이라는 단어가 있는 서버가 프리티어에서 제공되는 서버인것 같다. 참고로 Virtual Appliance 는 하이퍼 바이저에서 실행할수 있는 OS와 기타 소트프웨어를 포함하는 이미지 이다. 그리고 위에 보이는 AMI(Amazon Machine Image)는 EC2 서비스를 사용하기 위핸 Virtual Appliance 다.



Instance Type은 가상 서버의 크기를 결정하는 것이다. 여기도 역시 "Free Tier Eligible" 이라고 써있는것을 선택한다.



따로 설정을 변경할 일이 없기 때문에 모든 설정은 Default 로 되어있는것으로 하고 바로 Next를 누른다.



가상 서버에 저장장치를 추가하는 화면이다. 역시 Default로 하고 Next를 누른다.


   


여기는 태그를 추가하는 화면이다. 키-값의 쌍으로 이루어져 있다. 적당한 값을 넣고 Next를 누른다.





방화벽은 SSH로 접근을 허용할 수 있도록 기본 구성을 하고 "Review and Launch"를 클릭한다.



지금까지 설정사항을 보여준다. Launch를 클릭한다.



가상 서버의 키를 선택하는 화면이다. 나는 미리 키를 만들어둬서 기존에 만들어놨던 키를 선택했다. 만약 만들지 않았다면 EC2 서비스 화면에서 "Key Paris" 메뉴를 선택해서 만들면된다. 가상 서버를 로그인 하려면 키가 필요하며 이 키는 비밀번호를 대신해서 사용한다. "Launch Instances"를 클릭하면 모든게 마무리 된다. 



잘 동작 하는지 확인해보려면 맨 처음 보았던 화면(EC2서비스 화면) 에서 Instances를 클릭하면 현재 서버가 어떤 상태인지 확인 할 수 있다.

지금 글로 적기는 했지만 실제로 해보면 정말 간단하다. 윈도우 설치보다도 더 간단하다. 클릭클릭 몇번만 하면 내가 사용할 수 있는 서버가 짠~ 하고 만들어진다. 아직 모르는게 많지만 앞으로 써보면서 많이 배워야겠다.


728x90
반응형
반응형

테스트케이스를 만들어서 작업을 하면 소스코드가 수정될 경우 코드를 테스트 해보기가 참 수월하다. 그런데 이 테스트 케이스 작성하는게 생각보다 만만치는 않다. 

실제 DB 를 읽어서 테스트를 해야 하는지. 아니면 Mock 객체를 정의를 해서 사용을 해야 하는지. 실제 DB 를 사용할 경우 저장된 data 가 변경이 되어서 구현했을 당시 테스트 케이스는 Pass였지만 나중에 빌드 시점에 테스트 케이스가 실행될 경우에 Fail 이 나면 어떻게 할것인지. 

생각해보면 그냥 서비스 구현해서 화면 띄우고 버튼 눌러서 테스트 하는것이 더 편할지도 모른다는 생각이 들기도 한다. 

작성할 때마나 서비스 테스트,  repository테스트, 컨트롤러 테스트에 대해서 구글링 하면서 작성을 하다보니 뭔가 남는게 없는것 같아서 샘플을 한번 만들어보기로 했다. 

 

최근에 필요하기도 했고 나중에 또 써먹을 일도 있을것 같아서 Controller 테스트 케이스를 작성한 것을 공유해 본다.

 

각각의 구성은 아래와 같이 되어있다. 

(java : 1.8, SpringBoot : 1.5.3)

 

Book.java

@Entity
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long bookId;

    private String title;

    // Getter & Setter 생략
}

 

BookRepository.java

public interface BookRepository extends JpaRepository<Book, Long>{}

BookService.java

public interface BookService {
    Book getBook(Long id);
}
 

BookServiceImpl.java

@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookRepository bookRepository;

    @Override
    public Book getBook(Long id) {
        return bookRepository.findOne(id);
    }
}
 

BookController.java

@RestController
public class BookController {

    @Autowired
    private BookService bookService;

    @RequestMapping(value = "/book/{bookId}", method = RequestMethod.GET, produces = "application/json")
    public Book getBook(@PathVariable Long bookId){
        return bookService.getBook(bookId);
    }
}

/book/{bookId} 라는 url 로 request 를 보내면 bookId 에 맞는 Book 객체를 리턴해주면 되는 형태이다. 테스트 케이스 없이 테스트 하려면 톰캣으로 띄워놓고 실제로 화면에서 위에 정의한 서비스를 호출하는 컴포넌트를 클릭해서 정상 동작을 하는지 확인해봐야한다. 그러다가 소스에 글자라도 하나 틀리면 수정한다음에 다시 톰캣 재기동을 하는 번거로운 작업을 진행해야 한다. 

 

 

 

 

 

 

 

 

 

 

이런 번거로움을 피하기 위해 테스트 케이스를 작성해 보았다.

@RunWith(SpringRunner.class)
@SpringBootTest
public class BookControllerTest {

    private MockMvc mockMvc;

    @MockBean
    BookController bookController;

    @Before
    public void setup(){
        mockMvc = MockMvcBuilders.standaloneSetup(bookController).build();
    }


    @Test
    public void getBookTest() throws Exception {
        given(this.bookController.getBook(new Long(1)))
                .willReturn(new Book("Homes"));

        mockMvc.perform(get("/book/{bookId}", 1))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$['title']", containsString("Homes")))
                .andDo(print());
    }
}

BookController를  MockBean으로 정의를 해주었다. 그리고 BookController 의 getBook메소드에 파라메터가 1이 들어왔을 때 리턴 받는 결과를 미리 정의한다. (18~19 라인) 그리고 화면에서 요청하는 것처럼 Request를 수행해준다.  perform에 있는 파라메터를 보면 get 메소드를 호출하게 되며 파라메터로 1값을 넣어서 실행을 한다. OK 응답을 받게 되고 리턴 받는객체의 title이 "Homes"  인지 비교를 한다. 19라인에서 책 이름을 미리 Homes  로 정의 했기때문에 테스트는  Pass가 된다. 마지막에 andDo(print()) 는 실제 수행된 로그가 콘솔창을 통해 볼수 있도록 처리해 준것이다.

 

처음에 만들때는 좀 삽질을 하긴 했지만 만들고 보니 앞으로 자주 써먹을것 같다. 앞으로도 바쁘지만 테스트케이스를 만들면서 코드 작성을 하도록 해야겠다.

 

참고로 위 소스를 작성한 gradle.build 파일은 아래와 같다.

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')

    runtime('group:com.h2database:h2');

    testCompile('group:com.jayway.jsonpath:json-path')

    testCompile('org.springframework.boot:spring-boot-starter-test')
}
 

 

728x90
반응형

'Development > Java' 카테고리의 다른 글

[OAuth] Oauth의 간략한 흐름.  (0) 2017.07.04
[Spring Security]간단 Spring Security  (0) 2017.06.27
[Spring]Jasypt 를 이용한 properties 암호화  (6) 2017.04.25
[SpringCloud]Spring Config..  (0) 2016.01.26
spring Cache  (0) 2015.12.05
반응형

철권 하면 제일 먼저 생각나는것은 1:1 대전게임이지만 스토리 모드도 있다. 이야기가 진행되면서 중간중간 대전 퀘스트가 있어서 사용자가 직접 조작을 할 수 있다. 약간 RPG 성 게임모드를 둔것같다. 아무래도 맨날 1:1 만 하다보면 빨리 질리니깐 넣어놓은것 같다. 그런데 해보면 알겠지만 스토리모드가 중독성이 있다. 소설책 읽는 느낌이 들어서 계속 다음 챕터를 진행하고 싶은 충동이 생긴다. 



이야기는 프롤로그와 함께 시작된다. 한편의 소설을 써내려같은 느낌으로 이야기가 전개가 된다. 이야기를 하면서 그 이야기에 대한 실제 회상영상들이 나온다. 그리고 그 사이사이에 대전 모드가 나타난다. 





스토리모드 첫번째를 진행하고 나면 헤이하치가 정말 또라이구나 라는 생각이 절로 든다. 회사에 앉자마자 하는 일이 토너먼트 개최라니. 이시점에서 약간 갓오브 하이스쿨이 아주 스치듯이 생각이 났다. 현재 스토리모드의 난이도는 중간 모드이다. 잘해서 중간모드로 진행한것은 아니고 맨 처음 시작할 때 그냥 다음다음을 누르다 보니 중간모드로 선택이 되었다. 스토리 모드 도중에 난이도는 조절 가능한것 같다. 



챕터 제목이 불꽃의 복수인거 보면 마지막 장면에서 따온것 같다. 마지막장면에 카즈야는 도망치고 헤이하치는 폭발에 휩싸인다. 당연히 안죽었을거라 생각이 되지만. 앞으로 진행될 막장 가족의 이야기가 점점더 흥미진진해진다. 


728x90
반응형
반응형

지난번에 예약구매 했던 철권을 플레이를 해보았다. 

먼저 게임을 시작하면 인트로 동영상이 시작된다. 



내용을 보면 거의 막장드라마급이다. 내가 철권의 세계관은 자세히는 모르지만 일단 이 영상을 보면 아들이 아버지를 죽이려고 한다. 아마도 헤이하치는 아마도 좋은 아빠는 아닌듯 하다. 거의 싸움에 미친놈이니 아들이 눈에 보이기나 하겠어. 절벽에서 애를 던저버리다니 거의 막장오브 막장이다. 



게임의 시작 화면은 이렇게 생겼다. 그렇게 나쁘다 할정도는 아니지만 헤이하치만 저렇게 놓여있어서 아쉽긴 하다.

컨트롤 일개도 못하지만 사나이는 손과 발만으로도 이길수 있다는것을 보여준 한판이다. 연습모드이긴 하지만 역시 철권은 패드의 진동을 느끼면서 해야 재맛인것 같다. 



연습모드로 해봤는데 역시나 조작이 좀 어렵다. 예전에 철권2 할때는 연습모드에서 필살기 연습할수 있는 모드가 따로 있었는데 이번에도 있는지 한번 찾아봐야겠다. 패드로 하면서 느낀점은 일단 횡이동이 어렵다. 내가 조작을 잘못하고 있는건지는 모르겠는데 횡이동이 생각처럼 쉽게 안되서 분명 공간은 3차원인데 난 2차원에서 격투게임을 하고 있는 느낌이다. 철권 샀다고 조이스틱까지 지를수는 없으니 패드 조작법을 좀 찾아봐야겠다.


728x90
반응형
반응형

어머니의 심장 퀘스트는 증명의 의식이 시작되기 전에 에일로이가 마을 이곳저곳을 돌아다니면서 진행되는 퀘스트이다.

퀘스트라기에는 거의 하는것이 없고 대부분이 말을 걸어보고 대화하는게 주요 역할이다. 





에일로이에게 친구가 없을텐데라는 생각에 오랜친구가 누군가 했더니 에일로이가 어렸을때 절벽에서 떨어진 부족아이를 구하는 퀘스트(2017/05/14 - [Enjoy Life/Games] - [Horizon Zero Dawn]황야의 가르침)가 있었는데 그때 구해준 녀석이다. 이 퀘스트를 끝내면 옷을 받을 수 있다. 





마지막에는 사냥꾼의 오두막에 들어가서 쉬게 되는데 거기에서 바스트라는 녀석을 만난다. 이녀석도 에일로이가 어렸을때 에일로이한테 돌을 던졌다가 한대 맞은 녀석이다. 그때 에일로이가 돌을 맞은 다음 행동을 선택해야 했었는데 나는 돌을 던져서 손에 있던 돌을 떨어뜨린다를 선택했다. 영화나 드라마에서 꼭 이렇게 재수없는 녀석이 한명씩 나오는데 게임에서도 이렇게 나오다니. 난 분명 게임을 하고 있는데 한편의 드라마를 보고 있는것 같다. 


728x90
반응형
반응형

지난달 철권7 예약 판매가 있어서 예약구매를 했다. 보통 게임 사고 싶으면 출시 이후에 가격좀 떨어지면 사곤 했는데 이번에 같이 주는 예약 특전이 맘에 들어서 바로 예약구매를 했다. 그리고 잠시 잊고 있다가 6월 1일 출시후 바로 그날 저녁에 택배로 받았다. 


예약 특전에 포함된 것들은 철권7 타이틀과 커맨드북, 콜렉터즈카드, 프로모션 코드로 구성되어있다. 


위에 보이는 것이 커맨드 북이다. 내가 예약구매를 하게된 가장 큰 이유가 저 커맨드 북이었다. 커맨드북이 저정도 퀄리티이면 이건 예약구매 필수다라는 생각을 바로 했다. 

타이틀과 콜렉터즈 카드이다. 타이틀이야 다른 게임과 동일하고 콜렉터즈 카드야 플라스틱 카드 정도이다. 난 이것때문에 예판을 구매한게 아니니깐.



자, 바로 이거다. 커맨드북. 
거의 이건 커맨드 백과사전 수준이다. 펼쳐보기 아까울정도의 퀄리티라서 택배 받고나서 책에 쌓여있는 비닐 포장을 뜯어야되 말아야되 한순간 고민을 했다. 내가 이거 천년만년 소장할 것도 아니고 보면서 게임을 즐겨야지 라는 생각에 단숨에 겉 포장을 뜯었다. 그리고 펼쳐봤는데 내용도 알차게 들어있다. 책에는 캐릭터 컨셉아트(오른쪽 사진)와 캐릭터 커맨드(왼쪽 사진), 개발자 인터뷰로 구성되어있다. 손이 거의 폐급이라서 모든 캐릭터의 커맨드는 못외울거고 맘에 드는 캐릭터 몇개만 연습좀 해서 게임을 해봐야겠다. 

게임사고 뿌듯하기는 정말 오랜만인것 같다. 


728x90
반응형
반응형


개봉을 한다고 하길래 한번 꼭 보고 싶었던 영화이다. 개봉 당시에는 극장에 가서 보지는 못했는데 이제서야 영화를 보게 되었다.

스칼렛 요한슨이 쿠사나기 역을 맡는것에도 기대가 됐다.

예전에 학교다닐때 애니메이션으로 처음 봤던 공각기동대는 이해하기가 정말 어려웠다. 애니메이션이라서 보긴 봤으나 대체 무슨 이야기인가 라는 생각이 들었었다. 그저 그때당시의 생각으로는 네트워크를 이용해서 모든게 연결되어있고 인공 의체를 사용한다는 모습들이 그저 신기하게만 보였다. 과연 이런 세상이 올까라는 생각도 들었었다. 


<출처 : http://movie.naver.com/movie/bi/mi/basic.nhn?code=134838#>


영화는 애니메이션을 어느 정도 의식을 한것 같았다. 공각기동대 시리즈를 다 보지는 않았지만 내용이 어려움에도 불구하고 매니아층을 형성하고 있어서 애니메이션을 무시하기에는 무리가 있었을 것이다. 그래서 기존 애니메이션에서 나왔던 장면들을 영화속에서 많이 재현을 했다. 처음 빌딩에서 떨어지는 장면이라든지 물에서 싸우는 장면등 여러개의 장면들을 볼 수 있다. 

하지만 영화보다는 역시나 애니메이션이 더 낫다는 생각은 어쩔수가 없다. 영화를 보고 있는 내내 좀 어설프다라는 생각이 많이 들었다. 그리고 쿠사나기 역을 맡은 스칼렛 요한슨의 모습과 표정이 "루시" 에서 나온 모습과 너무 똑같다는 생각이 들었다. 마치 이 영화가 루시의 후속편인것 같은 느낌이었다. 공각기동대의 영화화에 대한 기대가 개봉전부터 많았었는데 나같이 실망을 한 사람들도 많이 있었을 것 같다. 


공각기동대 극장판 애니메이션이 처음 개봉한 때가 1995년이라고 한다. 아마도 내가 극장판을 본 시점은 1998~2000 이쯤이었을것 같다. 그때 한참 애니메이션을 많이 봤던 때였으니깐. 그때 당시에는 애니메이션에서 나온 모습들이 전혀 상상이 안됐다. 미래에 있을법 한 이야기 이지만 아주 먼 이야기 인것 같았다. 그런데 영화를 본 지금 시점에서는 "아. 이런 일이 일어날 수도 있겠구나." 라는 생각을 하게 되었다. 불과 10년, 15년정도 된것 같은데 많은것이 발전하고 변하게 된것이다. 

전 세계의 모든 사람들이 네트워크 상에서 서로를 공유하고 있고 이미 네트워크는 없어서는 안될 하나의 인프라로 자리 잡았다. 지금은 스마트폰이나 컴퓨터를 통해서 하고 있지만 언젠가는 영화에서처럼 직접 사람이 네트워크에 연결되어서 서로를 공유하게 될 것이다. 굉장할것 같으면서도 내 모든게 오픈 되어있다는 점에서는 꽤나 섬뜩한 일이다. 영화에서처럼 기억이 조작되어 무엇을 사실이고 아닌지 모르게 될수도 있을 것이다. 

지금에서야 이렇게 현실 가능성이 있다고 생각한 일들을 15년 전에 이미 생각을 한 오이시 마모루 감독이 새삼 대단 하다는 생각이 든다. 그리고 조만간 공각기동대를 전체적으로 한번 정주행을 해봐야겠다. 




728x90
반응형
반응형

맨날 붙여넣기만 하다가 오늘은 갑자기 의문이 들었다.

npm install --save 하고 --save-dev가 대체 뭔 차이지? 잘 안쓰고 맨날 찾아서 붙여넣기만 하니 알리가 있나..


그래서 찾아봤다. 구글 검색을 해보니 아래와 같은 글이 있었다.


https://www.linkedin.com/pulse/npm-dependencies-vs-devdependencies-daniel-tonon


내가 쓴 내용은 위에 링크의 글을 일부 번역한 글이다. 


npm install module --save 

 

특정 A 모듈을 Install --save 옵션을 넣으면 package.json dependencies 목록에 포함된다Dependencies 목록에 있다는 것은 현재 npm 모듈이 A 모듈 없이는 사용할 없다는 뜻이다. 즉, A 모듈 없이는 동작하지 않는다.

 

npm install module --save-dev 


특정 A 모듈을 Install --save-dev 옵션을 넣으면 package.json devDependencies 목록에 포함된다이건 현재 npm 모듈은 A 모듈과는 dependency 없지만 개발 환경에는 연관성이 있다는 뜻이다

 


 

npm 으로 퍼블리싱을 경우

npm 모듈이 동작하는데 필요한 모듈이라면 --save 플래그를 사용하고 모듈 동작에는 필요 없지만 테스트에 필요하다면 --save-dev 플래그를 사용한다.

 

NPM으로 퍼블리싱을 안할경우

상관할 필요는 없지만 작성한 소스코드에 영향을 주는 모듈은 --save, 컴파일러가 작동하는데 필요한 모듈은 --save-dev 플래그를 사용한다.


728x90
반응형

'Development > Frontend skills' 카테고리의 다른 글

edX - Introduction to ReactJS Module1 내용정리  (0) 2018.04.18
[npm] 왠지 자주 쓸것 같은 npm 명령어  (0) 2018.04.17
map() 메소드 사용  (0) 2017.01.16
React 에서 props 사용  (0) 2017.01.09
React.. 끄적끄적.  (0) 2017.01.09
반응형

에일로이는 부상당한 소크로부터 도움을 요청받는다. 소크는 사냥 도중 부상을 당했으며 스크래퍼를 향해 창을 던졌으나 잘못해서 부상을 당했다. 그런데 스크래퍼가 소크의 아내가 만든 소중한 창을 꼽은채 달아났고 소크의 딸인 아리나는 엄마가 만든 창을 찾는다며 스크래퍼를 쫓아갔다. 그런 딸이 걱정되어 소크는 에일로이에게 아리나를 찾아달라고 도움을 청한다. 


아리나 찾기


나침반 방향이 가르키는데로 가다보면 아리나를 쉽게 찾을 수 있다. 아리나는 와쳐들에게 둘러쌓여있기 때문에 와쳐들을 다 때려 제거하고 나서 아리나하고 이야기를 하면 또다른 미션을 얻게 된다. 이제는 와쳐 정도는 대충 때려도 잘 잡히는것 같다. (역시 게임은 레벨업이다.)


아리나 흔적 추적하기


스트래퍼를 쫓아간 아리나의 흔적을 찾아야 한다. 이거 하면서 처음에 어떻게 흔적을 찾는지 몰라서 좀 헤맸다. 포커스를 사용해서 아리나의 흔적을 찾은다음 그 흔적을 표시를 하면 포커스를 끈 후에도 그 흔적이 계속 보이게 된다. 그것도 모르고 어디로 갈지 몰라서 주변만 뱅뱅 돌아다녔다. 




아리나의 창 되찾기


이제 드디어 아리나의 창을 되찾기 위해 스트래퍼와 한판 벌여야 한다. 역시나 패드 조작이 미숙하다 보니 몇번 죽고 난 후에 창을 되찾았다. 물론 동영상은 한번에 성공한 영상이다. 다 죽인줄 알고 아이템 줍고 있다가 다른 스트래퍼한테 몇번이나 죽었다. 여전히 시야와 방향이 익숙치 않아서 잘 발견되고 잘 죽는것 같다. 

다음 미션은 어떤게 나올지 점점 더 궁금해진다. 



728x90
반응형

+ Recent posts