오늘 한일

- DI 및 Spring DI

  • DI 및 Spring 의존관계 연결에 대한 학습

  • 실습 요구 단계 분석 중

- 유인동님의 자바스크립트로 알아보는 함수형프로그래밍 강의


오늘 느낀점

  • 솔직히 자바가 아닌 자바스크립트이기 때문에 내가 얼마나 알아 들을 수 있을까 싶어서 큰 기대는 하지 않고 기본적인 내용들을 알았으면 좋겠다는 마음으로 함수형 프로그래밍 강의를 참석했었다. 안 들었으면 정말 아쉬울뻔했다. 정말 좋은 경험이었다.
    일단, 함수형으로 작성한다는게 무엇인지에 대해 배웠고 말로만 듣던 용어였던 클로저가 무엇인지 처음으로 알게됐다.(생각보다 안어려울거 같은데…) 거기다 자바의 스트림에서도 주로 사용하던 map, filter, reduce를 보게 됐는데 이전까진 filter를 제외하고는 스트림상에서 빨간줄이 안보이게(?) 일정 부분은 감각적으로 처리했던 부분인데 내부를 구현해 나가는 과정을 보게 되니까 좀더 그 실체에 대해 알게된것 같아서 직접적인 학습에 도움이 되는 부분으론 오늘 가장 큰 수확 일 것 같다.
    추첨때 운이 좋아 책도 선물로 받았는데 함수형에 대해 고민하거나, 학습을 하고 싶을때 많은 도움이 될 것 같다.

  • 오후부터 한두 번씩 누워서 푹 자고 싶다는 생각이 들 정도로 오늘은 많이 피곤했다. 가장 그런 생각이 많이 났던 순간은 DI를 공부하면서 xml을 바라 볼 때였다. 학습적인 생각은 안들고 “이걸로 의존관계를 설정 하셨던 분들은 고생이 많았겠구나” 이런 생각만 들었다….
    실습 요구 사항까지 보긴 했는데 집중도 덜 되고 봤던 내용들도 하나도 기억에 안 남아 있는 것 같으니 내일 빠르게 다시 보고 실습을 시작해봐야겠다.


내일 할일

  • DI 프레임워크 실습

일단 영어가 친숙하신분이라면 여기를 눌러서 stackoverflow의 도움을 받아도 된다.

(만약 일정 이상으로 터미널 환경 및 리눅스에 익숙하다면 가장 밑에 있는 요약을 보고 자신의 환경에 맞춰서 명령어들을 입력하면 된다. 당연한 소리지만 자신한테 맞춰 폴더, 파일명들만 바꿔주면 된다)


새로 노트북을 사서 우분투를 설치했는데 인터넷이 안되는 문제가 발생했다.

혹시나 유선으로 연결을 하니 그건 또 잘 된다. 결국 문제는 와이파이…

인터넷에 있는 이런저런 방법들을 따라해봤지만 해결이 안된다.

그러다 발견한 해결 방법을 공유하도록 하겠다.

우분투 버전 : ubuntu 16.04 LTS

노트북 : lg 2017년 올데이 그램 15ZD970-GX5SK

대략적인 문제의 원인은 해당 배포판이 무선인터넷 장치를 지원하지 못해서 생긴 문제라고 한다.

해결 방법은 와이파이 드라이버를 지원하는 펌웨어를 받아주면 된다.

최대한 상세히 설명은 하겠지만, 우부투를 노트북에 깐걸 보면 터미널 환경 혹은 명령어를 따라 칠 줄은 안다는 전제로 설명 하겠다.

lspci #시스템에 있는 PCI 디바이스 정보를 출력한다.

자신의 무선랜카드가 어떤 제품인지 확인을 해본다.

무선랜

네트워크 컨트롤러에 해당하는 장치가 QCA6174라는 제품이란걸 알수 있다.

만약 여기서 네트워크 컨트롤러가 안보인다면 장치자체가 인식이 안되고 있는 것일테니 다른 문제일 확률이 높다.

현재 이 해결 방법은 장치는 인식하지만 드라이버가 지원을 안하는 경우의 해결 방법이다.

만약의 다른 제품이라도

QCA4019 QCA6174 QCA9377 QCA9887 QCA9888 QCA988X QCA9984 QCA99X0

여기에 해당하면 가능할거라고 판단된다.

그러면 다음으로 우리가 받아야 하는 펌웨어를 받도록 하자

(이글을 보고 있다면 나처럼 유선으로 자료를 찾고 있는 것일테니….)

wget https://github.com/kvalo/ath10k-firmware/archive/master.zip

또는

git clone https://github.com/kvalo/ath10k-firmware.git

혹시 터미널에서 ctrl + v가 안 먹혀서 직접 입력 하시는 분이 있으면 ctrl + shift + v를 누르면 된다.
(터미널에서 복사 해 올때는 거꾸로 ‘c’)

자신이 편한 방법으로 받으면 되는데 생각보다 시간이 걸린다.
(단, wget으로 받으면 압축파일이기 때문에 압축을 풀어줘야 한다)

다음으로 받은 펌웨어 파일을 복사 하도록 하자

sudo cp -r ath10k-firmware-master/QCA6174 /lib/firmware/ath10k/

(만약 gir clone으로 받았다면 폴더 명이 ath10k-firmware일수도 있다.)

복사후 firmware-5.bin_xxxxxx 같은 파일의 이름을 firmware-5.bin로 변경하여 복사해 준다.
나와 같은 칩셋(QCA6174)이라면 아래의 명령어를 쳐주면 끝난다.

sudo cp -r /lib/firmware/ath10k/QCA6174/hw2.1/firmware-5.bin_SW_RM.1.1.1-00157-QCARMSWPZ-1 /lib/firmware/ath10k/QCA6174/hw2.1/firmware-5.bin

sudo cp -r /lib/firmware/ath10k/QCA6174/hw3.0/firmware-4.bin_WLAN.RM.2.0-00180-QCARMSWPZ-1 /lib/firmware/ath10k/QCA6174/hw3.0/firmware-4.bin

만약 다른 무선랜을 사용하고 있다면

cd /lib/firmware/ath10k   #해당 경로로 이동

ls  #자신의 무선랜 폴더가 있나 확인

cd QCAxxxx  #xxxx에 자신의 무선랜 숫자를 입력하면 된다

QCAxxxx 폴더에 들어간다음 ls를 입력해서 보면 한개 혹은 두개의 hwx.0(x는 임의의 숫자다)폴더가 보이는데 해당 폴더에 들어가서

firmware-x.bin_xxxxxx 같은 파일 이름을 firmware-x.bin로 변경하여 복사해야 한다.
(사실 어차피 기존의 파일을 덮어쓰는 형태에 새로 옮겨넣은 bin_xxxxxx 파일을 해당 이름으로 사용을 안하는걸로 판단돼서 cp 대신 mv를 사용해도 될 것 같은데 스택오버플로의 대부분의 답변은 cp명령어를 활용하고 있어 일단 그걸 그대로 따른다)

파일 이름까지 변경을 했다면 이제 재부팅만 해주면 정상적으로 와이파이가 작동하는 걸 볼 수 있을 것이다.

reboot  #재부팅, 개인적으로 재부팅시 이 명령어를 입력하고 엔터를 탁! 눌러 주는 걸 선호한다.

내 무선랜인 QCA6174을 기준으로 간단히 요약하면(파일, 폴더 명들을 확인하도록)

lspci #자신의 무선랜 장치를 확인

wget https://github.com/kvalo/ath10k-firmware/archive/master.zip  #이후 압축 해재

sudo cp -r ath10k-firmware-master/QCA6174 /lib/firmware/ath10k/

sudo cp -r /lib/firmware/ath10k/QCA6174/hw2.1/firmware-5.bin_SW_RM.1.1.1-00157-QCARMSWPZ-1 /lib/firmware/ath10k/QCA6174/hw2.1/firmware-5.bin

sudo cp -r /lib/firmware/ath10k/QCA6174/hw3.0/firmware-4.bin_WLAN.RM.2.0-00180-QCARMSWPZ-1 /lib/firmware/ath10k/QCA6174/hw3.0/firmware-4.bin

reboot

간혹가다가 우분투가 업데이트 되면서 다시 와이파이가 안잡히는 경우가 발생하므로 받아논 파일은 지우지 말고 남겨뒀다가 재활용하는 것이 좋다.

24~25일 한일

- Spring MVC 실습

  • PUT, DELETE 사용

  • HandlerMethodArgumentResolver를 적용

- OOP 기반 구현 및 테스트

  • https://github.com/slipp/jwp-spring 의 step3-dependency-injection 브랜치로 실습 진행

  • QnaService의 deleteQuestion() 메소드가 가지고 있는 핵심 비지니스 로직을 User, Question, Answer가 구현하도록 리팩토링(진행중)

- 지킬 블로그 테마의 css 수정

  • code 블럭 내의 a 태그 색상 변경(두 색상이 비슷하여 가독성에 문제 발생)

24~25일 느낀점

  • 토요일에 오랜만에 친구들을 만나서 쉬기도 하고 크리마스 연휴라 그런지 이틀간 제대로 집중이 안됐다. 하려고 했던건 더 많았는데 많이 못한거 같아 좀 그렇지만, 대신 조금은 느긋하게 작업들을 하면서 편히 쉰거 같다.

  • ubuntu에서 와이파이가 작동안하는 문제에 관한을 작성하면서 특정 부분의 css가 너무 마음에 안들어서 어떻해야하나 고민하다가, 몇일전 트램이 직접 자신의 블로그의 css를 손봤던걸 떠올리고 나도 한번 도전해봤다.

    wget https://github.com/kvalo/ath10k-firmware/archive/master.zip
    

    그래서 2시간 동안 작업해서 완성한게 이거다.
    처음에는 해당 링크 부분이 배경과 같은 검은색이라 하나도 안보였다. 가능하면 코드 블럭내에서 자동적으로 a 태그가 안걸렸으면 하는데 이건 어느부분을 고쳐야 할지 감이 안와서 차선책으로 색을 변경하는 방법을 선택했다.

    확실히 프론트단 작업은 아직 능숙하지 않아서 저런 간단한 작업을 하는데 지나치게 많은 시간이 걸렸다.(사실 내가 받은 테마의 구조를 파악하는데 가장 오래걸렸다) 하지만 오늘처럼 필요에 의한 삽질을 좀 하고 나면 비슷한 문제가 발생해도 해결 할 수 있겠다는 자신감이 생기는 것 같다.

  • 어쩌다 보니 가장 뒤로 밀려서 가장 해보려고 했던 QnaService에서 비즈니스 로직을 옮기는 걸 못했다. 좀더 작업 해봐야 겠다.

  • 내년 크리스마스는 밖에서 보내자(오늘처럼 혼자서 카페 말고, 아 친구도 제외)


내일 할일

  • OOP 기반 구현 및 테스트

    • QnaService의 핵심 로직을 Question이 가지게 완성
  • DI 및 Spring DI 공부

    • 가능하면 실습 시작
Spring MVC - PUT, DELETE 사용하기

Spring에서 PUT, DELETE를 사용해보자

HTML Form으로는 GET, POST 방식의 요청만 가능하고, PUT,DELETE의 실제 요청은 POST로 전송되기 때문에 단순히 method="PUT" 같이 작성한다고 PUT, DELETE 메소드 사용이 안된다.

이를 위해 form 내부의 같이 hidden 타입의 input을 작성하고, httpMethodFilter를 이용하여 request로부터 정보를 읽어와 PUT, DELETE로 구분한다.


자 그러면 PUT, DELETE 메소드가 사용 가능하게 하는 방법을 보도록 하겠다.

  • PUT, DELETE를 사용하고 싶은 form에 hidden 타입의 input을 작성 한다.

    <form class="form-delete" action="/questions/${question.questionId}" method="post">
      <input type="hidden" name="_method" value="delete" />
      <button class="link-delete-article" type="submit">삭제</button>
    </form>
    
  • 이후 WebApplicationInitializer 인터페이스 구현 또는 web.xml 파일을 생성한 후 HiddenHttpMethodFilter를 설정해야 한다.

    WebApplicationInitializer란?

    ServletContext은 Servlet 3.0+ 환경에서 구현되는 인터페이스로 기존 web.xml기반 접근 방식과 반대되는 방식이다. 또는 동시에 적용 가능하다. (docs.spring)

    public class MyWebInitializer implements WebApplicationInitializer {
    	@Override
    	public void onStartup(ServletContext servletContext) throws ServletException {
        //생략
    		servletContext.addFilter("httpMethodFilter", HiddenHttpMethodFilter.class)
    				.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*");
        //생략
    }
    

    web.xml을 이용하고 싶다면..

    <!-- HTTP Method Filter -->
    <filter>
        <filter-name>httpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>httpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    그러면 Controller단에서 GET뿐만 아니라 PUT, DELETE까지 사용이 가능해진다.

    @RequestMapping(value = "/{questionId}", method = RequestMethod.GET)
    
    @RequestMapping(value = "/{questionId}", method = RequestMethod.PUT)
    
    @RequestMapping(value = "/{questionId}", method = RequestMethod.DELETE)  
    

    이처럼 생각보다 간단하다.

오늘 한일

- [코드스쿼드 Maker Class] 아두이노를 이용한 아크릴 조명 만들기

- 오랜만에 친구들을 만나러 간다


오늘 느낀점

  • 아두이노를 가지고 아크릴 램프를 만들었는데 확실히 아두이노나 라즈베리파이가 가지고 놀기 재밌는 장난감인거 같다

내일 할일

  • Spring MVC 실습

  • Mockito 테스트 라이브러리를 활용한 테스트 Model과 dao 분리 실습