본문 바로가기
개발공부하며 느낀 인생 공부

손을 움직여라 실험을 해라 뭐든 해라[20220811 til, 자바 스프링 부트get method parameter 받아오기]

by 날파리1 2022. 8. 11.

뭐든 해라

항상 무언가를 하고자 할 때 항상 오는 조언이 뭐라도 해라 이다. 대학을 졸업하고 무엇을 할지 정말 아무것도 모르겠을때 뭐든해라라는 조언을 자주 많이 받았는데 참... 뭐..? 대체 뭐? 아니 뭘 할지도 모르겠는데 라는 생각이 정말 몇 달을 거진 반년 넘게 지배하면서 흐지부지한적이 적지 않다.

그러면서 또 고민과 걱정은 어찌나 많은지. 아이러니하게 뭐든 그냥 생각말고 닥치는데로 하는 사람보다 앉아서 생각을 한다며 사색과 고민하는 사람이 스트레스의 정도가 훨씬 크고 일의 진척도 느리다.

생각만 한다고 답은 절대 진짜 안나온다. 하면서 생각을 해야한다.

개발자 코스 시작 무렵 코딩 문제를 풀 때 몇 가지 케이스가 있는데도 저 개별적인 케이스가 어떻게 일반적인 식이 되겠어라며 혼자 자꾸 일반적인 식을 추론하려고 애썼다. 그러다보니 도저히 못풀겠고 머리는 과부하고 너무 복잡하고 반복문만 보면 도망가게되고 그랬다. 나 혼자 과제가 16개나 밀려있고 나혼자 뒤쳐지는 느낌에 잠 도 못자고 머리를 썼는데... 바뀐게 없었다 ^^;

가장 문제를 빨리 푸는 동료에게 물어보니 자신은 하나의 케이스를 정해서 넣어보고 맞는지 본다고 했다. 또 그러고 나면 2번째 케이스 이렇게 해결한다고 했다. 처음엔 나도 습관이 안되있어 도저히 적응이 안되었는데 트레이너도 하나의 케이스를 잡고 풀어서 써보며 식을 만들어 가라고 했고 우리에게 강의를 하시는 코딩의 신 아샬님도 테스트 케이스를 짜며 구조를 짜갈때 하나의 시범 케이스를 정하고 코드를 짜갔다. 

 

늘 그렇듯 처음부터 완벽한 것은 없다. 하다보니 가까워지는 거지.

 

리팩토링도 마찬가지이다. 처음부터 좋은 리팩토링을 하면서 해나가려고하면 코드 짜기도 바쁜데 미칠 것 같다.

 

일단 오늘 한 실험을 좀 결과로 남기려고한다.

 

Get Method  에서 Parameter  받아오기.

정말 이런 포스팅은 수없이 많지만 제대로 그것이 서버에서 어떻게 반영되고 연동해야하는지 가르쳐주는 곳이 없더라...하

 

그래서 정리한다.

 

1. 서버에서 Get  에서 원하는 변수를 받는 것은 2가지이다.

일단 @QueryString 은 안되고 그냥 다 @RequestParam으로 받는다

 

1. <input> 에 직접 넣어주는 변수 -> 설정한 변수 type 과 넣은 변수 값으로 자동으로 주소에

localhost:8080/설정한 get 주소?(변수타입명)=(입력한 변수명)

이렇게 잡힌다. ? 는 따로 설정해주는게 아니라 그냥 서버가 처리하는 규칙이다. 이따가 좀 더 설명하겟다.

 

2. <input>에 안넣더라도 페이지내에서 클릭해서 이동하는 화면 등의 것들은 그냥 직접 설정해줄수있다.

말이 어려운것 같은데 게시물 페이지 1, 2 같은 것들을 클릭할때 하이퍼 링크 주소를 get 메서드 형식에 맞게 써준후 네트워크를 들어가보면 알아서 변수로 인식하고 있다. ( 즉 서버가 메서드를 인식하는 규칙을 맞춰주는게 중요하다.)

 

@GetMapping("/posts")
public String postsPages(
    @RequestParam(value = "search", defaultValue = "") String author,
      @RequestParam(value = "page" , defaultValue =  "1") int pageAddressNumber
) {

  String[] filteredPosts = postService.displayPosts(author);

  String pageLinks = postService.createPageLinks();
  PageGenerator pageGenerator = new PostsPageGenerator2(filteredPosts,pageAddressNumber,pageLinks);

  return pageGenerator.html();
}

위처럼 검색하는 변수든 직접 입력을 통해 되는 변수든 두개 다를 그냥 받아오면 된다. 그리고 두개 중 단일로만 쓰는 경우가 많을텐데 그때 디폴트 밸류를 잘 설정하여서 아예 접속이 안되는 일이 없도록하자! 중요!!

 

시도와 오류

@GetMapping("/posts?search={name}&page={pageNumber}")
public String postsSearchAndPages(
    @RequestParam(value = "search", defaultValue = "") String author,
    @RequestParam(value = "page" , defaultValue =  "1") int pageAddressNumber
) {

사실 url 을 우리가 짜준다길래 저렇게 직접 조합해서 쓰는줄알았다. 그리고 위에 "/post"링크를 따로 두엇다. -> 젤 위의 것 하나만 서버는 인식한다. 

 

테스트코드

테스트 코드에서 정말 도움을 많이 받았는데 아까 1번에서 ? 의 역할이여기서 나온다. url 을 맞추어 테스트를 하려고 아래처럼 직접 규칙에 해당하는 url을 "/posts?search=페페" 이렇게 넣었다.

@Test
void searchPosts() throws Exception {
  mockMvc.perform(MockMvcRequestBuilders.get("/posts?search=페페")
          .param("page","")
          .param("search","페페"))
      .andExpect(content().string(
          containsString("페페")
      ));
}

그런데 테스트 오작동 결과를 보니 이렇다.


MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /posts
       Parameters = {search=[페페, 페페], page=[]}  // 변수가 두번 들어감 즉 변수를 직접 url 안써주고 그냥 .param을 하면 알아서 처리를 해줌
          Headers = []
             Body = null
    Session Attrs = {}

 

이것을 아는데 정말 한참 걸렸지만 진짜 뭐든 다 테스트 해봤다.

 

다시 결론

즉 인풋 을 이용해 넣는 변수나 직접 하이퍼 링크설정을 통해 주입하는 변수나 규칙성을가지고 만들어진다.

localhost:8080/설정주소값?(변수타입)=(변수명)

 

따라서 저 변수명에 맞게 주소를 짜서 하이퍼링크에 넣어준 후 원하는 화면을 보여주면 겟 메소드에서 화면을 바꿀수  있다!

 

다시 인사이트

뭐든할 때에는 일단 너무 산을 안보는 것 이 중요한 것 같다. 산을 가려면 일단 산을 가기위해 앞 정문을 보고 정문을 향해 가고 그다음 고개 고개 하나씩이 중요하다. 그래야 그것만 보고 갈 수 있다. 가는데에도 무수한 난관과 갈림길이 있을 것이다. 어쩔수없다. 기준을 정한뒤 다 가봐야한다. 여기서 기준이 중요하다. 즉 

아 산(이루고자하는 큰 목적)을 가네? 뭐 어쩌지...휴 고개만 10개가 넘는데 휴 어떤
루트를가지..
아 산을 가네? 일단 정문을 가자! 어!? 또 갈림길이네 그럼 이번엔 A갈림길에서 갈림길들을 다 가보고 아니면 B 갈림길로 가본 후 차례차례 기록을 해두자.

후자처럼해야한다.

 

완벽한 정보는 없다.

자꾸 내가 고민한것을 누구도 했을까봐 블로그만 왕창 뒤지는데 정말 무슨 소리인지도 모르겠고 해보지도않으니 더 와닿지도 않는다.

정보가 완벽할 순 없더라. 그냥 일부만 가지고 그거가지고 직접 해보는게 중요한 듯 하다!

 

그리고 테스트 코드는 진짜 좋은 것 같다. 할수록 위력을 느낀다.

 

괜찮다 삽질이라도 그거라도 하자! 이땅이 삽질하기 별로인 거라도 알테니

댓글