본문 바로가기

FastCampus - 한번에 끝내는 Java|Spring 웹 개발/03 스프링 입문

(18)
스프링 Ch 10 맛집 - memory DB - 패스트캠퍼스 챌린지 16일차 실습의 날입니다. 이번엔 실습에 시간을 좀 투자해야 해서 일부러 진도를 많이 안 나가고, 매우 단순할거라 예상했던 Memory CRUD DB 만을 실습해봤습니다. 가능하다면 JPA (Java Persistence API, 자바답게 이런 거 하나하나 다 표준임) 을 써보고싶었는데, 아무래도 10분내에 날름 해치우고 쓰기에는 무리가 있었습니다. C# 계열의 "EF Core" 라는 ORM 을 배워본 적이 있어서 쉬울 줄 알았는데 자바답게 표준때문에 좀 더 깊게 배워야 쓸 수 있을 거 같이 생겼더라구요. 당연히 Hibernate랑 SQLite 를 썼겠지만... (*참고: 여기있는 코드들은 강의와는 좀 다릅니다. 강의를 한 번 쭉 본 뒤, 가급적이면 안 보고 직접 짜보는 방법을 썼거든요.) MemoryRepo 별..
스프링 Ch 9 Swagger/OpenAPI - 패스트캠퍼스 챌린지 15일차 앗싸 오늘거 실습 필요 없다 실습당했다 Swagger 입니다. 지금은 OpenAPI 랑 반반무마니 해서 갈라지긴 했는데 아무튼 API를 예쁘게 표준에 맞춰서 json 형식으로 문서화해주고, 클라이언트까지 알아서 만들어주는 편리한 친구입니다. 그런데 강의에서 제가 몰랐던 새로운 활용법을 알려주더라구요? 바로 /swagger-ui 페이지에서 마치 Postman 같은 거에서 실행해보듯이 바로 테스트를 해볼 수 있다는 것이었습니다. 이건 살짝 충격~ 사용하는 라이브러리 https://github.com/springfox/springfox springfox 프로젝트를 사용합니다. 기존 라이브러리(라는 게 있는지도 몰랐지만)들은 어노테이션을 수동으로 달아야 했지만, springfox 프로젝트를 사용하면 알아서 자동..
스프링 Ch 8-2~3 Spring 테스트 - 패스트캠퍼스 챌린지 14일차 오늘 볼 강의는 WebMVC 쪽의 테스트 작성이네요. 궁금했던 부분이니만큼 실습을 하면서 강의에서 자세히 설명해주지 않은 부분들을 이해해봐야겠습니다. 특히 이번건 스리슬쩍 넘어간 거 같은 부분도 있구요. @Mock, @MockBean 먼저 이해해야할 건 이 두 가지 어노테이션이 무엇을 의미하느냐입니다. short answer: mock 객체 생성을 대신 해줍니다. 일반적으로 모킹 프레임워크는 mock 객체를 만드는 함수를 제공해주죠? 필드를 초기화하는 것조차 귀찮았는지, 아니면 다른 이유가 있는건지 @Mock / @MockBean 을 필드에 넣어서 이를 대신합니다. @Mock: org.mockito.Mock: 필드를 mock 객체로 만듭니다. @MockBean: 스프링 건데, 위에 더해서 DI 컨테이너에..
스프링 Ch 7-3 네이버 검색 연동 / JUnit - 패스트캠퍼스 챌린지 13일차 이번 강의는... 정말 별게 없습니다. 단지 네이버 지역 검색 API로 앱을 등록해서 httpClient 로서 호출해보는 내용 뿐입니다. 이전 강의와 마찬가지로 역시 트러블슈팅이 어느정도의 부분을 차지하고 있으며, 쿼리 패러미터의 인코딩에 대부분의 시간을 소요합니다. 별도의 인코딩이 필요없고, URIComponentsBuilder 의 encoding() 만 잘 설정해주면 됩니다. 부스터샷을 맞은 다음날이라 약간 열기운이 있을랑말랑 해서 오늘은 쉬어가는걸로 실습을 간단하게 구경만 해보기로 하려고 했는데, JUnit 단원에서 뭘 하는지 궁금해서 미리 좀 봐두기로 했습니다. 다만 오늘 제대로 공부하는 건 무리고, 그냥 영상만 훑어보려구요. 이미 JUnit 4를 써보기도 했구요. JUnit JUnit 이란 - ..
스프링 Ch 7 Spring as client - 패스트캠퍼스 챌린지 12일차 오늘은 코로나19 부스터샷을 맞았습니다. 그래서 본디 하려고 했던 스프링 아키텍처의 라이트한 딥다이브(?)는 넘겨두고 다음장을 보기로 했습니다. 패캠 챌린지도 있고, 저는 부작용이 거의 없는 편이라서 학습을 대충 하고 오늘을 그냥 넘기기엔 아쉽네요. 혼자 했으면 그냥 넘기고 쉬었을텐데... 오늘의 내용은 서버간 연결을 위해 Spring 앱을 HTTP 클라이언트로서 동작시키는 내용입니다. 포트는 별개의 포트를 쓰구요, 클라이언트가 여러종류 있다네요. 강의에서는 자세히 설명을 안 해주셔서 제가 찾아봤습니다. 스프링에서 자주 쓰이는 클라 종류 RestTemplate - JDK 혹은 Apache 의 웹클라이언트를 기반으로 동작하는 동기 클라이언트랍니다. 강의에서는 이걸 다루는데, 스프링 개발자들은 공식 문서에서..
스프링 Ch 6-5 Filter / Interceptor - 패스트캠퍼스 챌린지 11일차 이번에는 앞단에서 핸들러로 요청/응답이 가기 전에 먼저 낚아채는 방법을 배웁니다. 방법은 두 가지입니다. Filter 인터페이스 구현 (및 컴포넌트로 밀어넣기): 앞단에서 ServletRequest / ServletResponse 를 조작할 수 있습니다. 날것의 요청을 읽거나 수정할 수 있는 만큼 매우 번거롭습니다. getReader() 를 앞에서 호출하면 뒤에서 두 번째로 호출해서 에러를 일으킨다던가... 이 부분은 우회할 수 있는 수단이 여럿 있다고 하지만 강의에서는 이상한 방법을 쓰더라구요. ContentCachingRequest 로 래핑을 하고, 요청이 다 처리된 뒤에 요청을 읽는다뇨? 설명도 좀 말이 안 됩니다. 다른 방법도 있다고 하니 차라리 나중에 필요할 때 해보는게 좋겠습니다. 방법은, j..
스프링 Ch 6-3 Exception 처리 + alpha - 패스트캠퍼스 챌린지 10일차 에러 처리 Exception 처리 단원에서는 간단하게 예외처리에 대해서 설명해주시는데, 웹앱 에러 처리의 어려움에 대한 내용이 나왔습니다. 에러를 반환하는 방법 (내려준다 내려준다 하니까 나도 내려줘야 할 거 같자나!!) 기본 에러 페이지 (스프링의 "화이트라벨" 페이지) 에러 코드를 떨구기 (제 입장에서) 바람직하지 않은 케이스: 클라이언트에서 200밖에 처리 못 하는 경우에는 메시지에 담아서 (*용문 욕설*) 에러 처리의 방법에 대해서는 요새 고민중인 내용이고, 이 글에 누구를 위해 어떻게 에러를 내줄건지 조금 더 자세히 나와있습니다. https://www.lpalmieri.com/posts/error-handling-rust/ (Zero to Production in Rust 라는 책의 일부를 블로..
스프링 Ch 6-2 custom validation - 패스트캠퍼스 챌린지 9일차 어제에 이어 spring validation 입니다. 오늘 강의 영상은 custom validation 부분인데, 어제 실습도 안 했으니 그것도 겸합니다. 마음같아선 진도를 더 나가고 싶긴 한데, 구정인 것도 있고 해서 일단 강의 하나와 더는 미룰 수 없는 실습 정도로 만족해야겠습니다. 검증은 스펙이다 저번에 언뜻 보고 Hibernate 의 구현체를 사용하는 거까진 봤는데, 알고보니 표준? 이라고 해야하나? 공통 스펙이 있고 그걸 구현하는 형태인 모양이더라구요. 유독 자바가 이런 게 많네요? 험난한 길을 먼저 앞서서 달렸다보니 이런거려나요. hibernate 의 구현체는 spring boot starter validationm 에 구현체로서 포함되어있다고 합니다. 어노테이션 자동완성을 켜면 꼭 두 개가 ..
스프링 Ch 6-1 validation - 패스트캠퍼스 챌린지 8일차 드디어 다음 챕터입니다. Object 에 어노테이션을 붙이던, newtype 패턴으로 검증 로직을 감싸던 데이터 객체의 검증 로직을 적절히 비즈니스 로직과 분리하는 것은 필수입니다. 아니면 하나하나 그걸 다 손수 if else 같은거로 검증하고 있어야 하니까요. 프로그래머가 제일 싫어하는 게 노가다 아니겠습니까? Spring 에서는 데이터 객체에 어노테이션을 붙여서 검증 방식을 결정합니다. 꽤나 풍부한 내장 검증 로직이 있어서 있는 거만 가져다써도 웬만한 사례에선 불편함이 없을 것 같아보이네요. 1강에서는 아직 커스텀 검증 로직을 만드는 방법은 나오지 않았어서 검증 로직이 어디에 들어가는지는 나오지 않았는데요, 아마 같은 클래스이거나 다른 클래스에 별도로 만들거나 또 어노테이션을 만들거나 그러지 않을까요..
스프링 Ch 5 OM/Annotation 정리 - 패스트캠퍼스 챌린지 7일차 오늘은 jackson OM 의 노드를 직접 사용해보기 / 어노테이션 정리 두 가지의 내용입니다. 시간이 없었는데 짧은 내용이라 이득 본 거 같은 기분이네요. Jackson 자세히 jackson OM 의 핵심 노드는 JsonNode (수정 불가) 와 ObjectNode (수정 가능) 두 가지입니다. 어째서인지 IDE가 말을 안 들어서 확인은 못 했지만 JsonNode 는 인터페이스고 ObjectNode 는 실제 오브젝트겠죠.... 는 틀렸네요. 그냥 부모클래스인가봅니다. JsonNode: https://www.javadoc.io/doc/com.fasterxml.jackson.core/jackson-databind/latest/com/fasterxml/jackson/databind/JsonNode.html ..