TIL 210602

박수빈·2021년 6월 2일
1

TIL

목록 보기
2/25

✔ 백준

11559

누적합 문제. 시간 제한이 1초라 많이 빡셌는데.... 아니 해도해도 안됐는데 input을 readline으로 하니까 바로 되어버렸다.
투포인터 문제와 유사하면서도, 투포인터보다 시간이 빡빡해서, 합을 매번 구하기보단, 누적합을 미리 구해두고 큰합-작은합 으로 해결했다.

15654

귀찮아서 그냥 permutation 함수 사용

1406

이 문제는 종현오빠가 스택으로 풀었는데, 맞는데 자꾸 에러가 난다고 찡찡 해서 다시 풀어보게 되었다.
덱 문제를 스택 2개로 해결하는 방식으로 풀었다.
알고보니 종현오빠가 readline이후에 strip을 안한게 문제가 되었다.

  • input() 함수는 개행문자 없이 한 줄을 받아 오고,
  • sys.stdin.readline() 은 개행문자를 포함하기 때문에 strip()이 필수적이다.

✔ 스프링 부트

인프런 김영한님의 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 강의

정적 컨텐츠


정적 컨텐츠의 경우, 스프링 부트가 컨트롤러를 찾고, 해당 컨트롤러가 없는경우, static에서 검색해 바로 뿌려준다.

파라미터 받기

  • @RequestParam 어노테이션을 사용한다. "name"은 주소창에서 파라미터를 넘겨줄 key이름, 뒤에 나오는 String name은 변수명이 된다.

  • 이렇게 주소창에 주소?key=파라미터 방식으로 http의 request방식을 사용한다

API

Response Body

  • @ResopnseBody 어노테이션을 사용하면, 리턴한 문자열이 웹에 바로 나타난다. html없이 http의 바디 부분에 문자열이 넘어간다.
  • Tamplate을 찾기 위해 ViewResolver에게 보내지 않고, HttpMessageConverter 에게 간다.
  • 문자열을 리턴할 경우, StringConverter을 이용해 문자열만 리턴한다.


이렇게 소스에 아무것도 없이 문자열만 있다.

JSON 방식으로 리턴하기


class에 필드값을 주고, getter와 setter를 만든다.
그리고 매핑 함수에서 object를 리턴하면,

이렇게 JSON 방식으로 뜨게 된다.
신기해서 age 변수도 디폴트 값으로 주고 해봤다. 그냥 필드값들이 다 자동으로 json으로 생성이 된다!!!!

  • 객체가 리턴되기 때문에 HttpMessageConverterJsonConverter가 작동이 되기 때문이다. (Jason으로 변환하는 라이브러리 중 MappingJacksonHttpMessageConverter가 이용된다고 한당,,)

비즈니스 요구사항 정리

일바적인 웹 앱 계층 구조

  • 컨트롤러: 웹 MVC의 컨트롤러 역할
  • 서비스: 핵심 비즈니스 로직 구현
  • 리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
  • 도메인: 비즈니스 도메인 객체 (회원, 주문, 쿠폰) 주로 데이터페이스에 저장하고 관리됨

아직 데이터베이스가 존재하지 않는다는 가정 하에 만들기 때문에, MemberRepository 인터페이스 하위에 MemoryMemberRepository를 둔다. 인터페이스 하위에 둠으로써, 나중에 데이터베이스가 생겼을 때 연결하기 쉽다고 한다.

도메인과 리포지토리 만들기

도메인


평범하게 클래스 만들어 준다.

리포지토리 인터페이스


인터페이스!!!를 드디어 사용해봤다. 책에서 예제만 따라쳐본 인터페이스.. 이렇게 사용하는 거였다 아주 AWSOME해
자바가 오랜만이라 헷갈렸는데, 리턴타입 함수명(타입 파라미터);로 이루어져있다.
데이터베이스에 저장하는 save 함수, id 검색, 이름 검색, 전체 가져오기 함수가 만들어져 있다.

메모리 리포지토리

일단 디비가 없으니까, 메모리에 Map을 이용해 저장하는 방식으로 만들어 본다.


implements로 인터페이스를 받아 구현했다.
store란 이름의 해시맵, id 저장을 위한 sequence가 있다.


save 함수는 이렇게 member를 받아, 해시맵에 저장하고, member를 리턴한다.
포인트는 저장시에 sequence에 미리 ++을 해 순서를 올려주는 것. 파이썬만 하다가 자바오니까 넘 오랜만에 써보는 ++


findById는 이렇게 get 함수를 이용해 가져오고, Optional.ofNuallable로 null일 경우,,, 아무것도 리턴하지 않는 것 같다. 아무래도? 나중에 더 자세히 한다고 했다.
널 처리 귀찮은데 이렇게 좋은 기능이 있었다니, 교수님은 왜 안알려준거지 ㅎㅎ


findByName은 자바의 람다식을 이용해 가져왔다. 없을 경우 findAny() 함수를 통해 null이 리턴될듯...?
람다식을 쓰니까 자바공부를 해야겠다는 생각이 든다. 그치만 귀차는걸 ㅜㅅㅜ


마지막으로 맵의 value를 list로 만들어 리턴해준다. 자바 리스트,,도 잘 다룰줄 모르는 나... .정말로 자바 공부 해야겠다...

테스트 만들기

현업에선 필수라는 test! 장고 공부할 때 test 함수를 작성해 봐서 어렵진 않았다.


repository 테스트를 위해, 객체를 하나 생성해준다.
테스트 함수들은 순서대로 실행되는 것이 아니기 때문에, 객체를 초기화 해주지 않으면 충돌문제가 발생한다.
그래서 @AfterEach 어노테이션을 통해 매 테스트 함수 실행 후, 저장소를 비워준다.


이렇게 test 코드를 작성해주고, 실행해주면 된다. 함수별로 돌리면 각각 돌아가고, 클래스를 돌리면 전체가 한번에 테스트 된다.

테스트는 장고 공부할 때 TDD로 했어서 정말 많이 썼더니 익숙하다! 이렇게 또 나는 성장하는군👍

서비스 만들기

서비스는 리포지토리에서 만든 함수들보다, 비지니스적인 이름의 함수들로 만든다.


이렇게 레포지토리에서 만들었던 함수들을, 비지니스적인 로직을 더해 개발한다.
중복 회원을 확인한다던가 등등!
함수를 그냥 기능을 만들고 refactor하는 기능으로 validateDuplicateMember를 생성했다. 리팩토 기능은 알면서도 맨날 까먹는다.. ㅋㅋㅋ

서비스 테스트하기

class 에서 ctrl + shift + t 하면 자동으로 테스트 클래스가 생성이 된다.


아까와는 다르게 BeforeEachAfterEach 를 모두 사용했다.
memberRepository를 생성자로 넘겨주어, 테스트에서 레포지토리를 참조할 수 있게 했다.
이렇게 되니까 테스트 코드가 아까에 비해 많이 복잡해졌다.


이렇게 중요한 기능인 중복된 경우, 예외처리 되는 것도 확인을 했다.

꼼지락🐥

책으로 공부할 때보다 훨씬 재밌었다. 자바를 깊게 공부해본 적이 없는데, 스프링부트 공부하면서 자바에 궁금해진 부분들이 생겨서, 스프링부트 끝나면 자바책을 한 권 봐야겠다.
묘하게 공부했던 모든 것들이 밑걸음이 되고, 빈칸이 채워져서 보람차다 :)

profile
개발자가 되고 싶은 학부생의 꼼지락 기록

0개의 댓글