블로그
전체 112025. 03. 10.
0
[인프런 워밍업 클럽 3기 - BE 클린 코드, 테스트 코드] 1주차 발자국
1주차 발자국이제까지 읽기 좋은 코드를 작성하기 위해서 따로 기준을 잡지 않고, 그저 내 눈에 읽기 가장 좋게 코드를 작성했었다. 하지만 강의를 들으며, 사고의 depth부터 시작하여, SOLID 원칙까지 읽기 좋은 코드를 작성하기 위해서 어떻게 사고를 해야하는 지 많이 얻어갈 수 있었던 강의였다. 가장 기본적인 추상과 구체를 시작으로 일기 좋은 코드를 만들기 위한 자세, 추상의 관점으로 바라보는 객체 지향 등을 통해 앞으로 읽기 좋은 코드를 작성할 때, 어떻게 생각할 지 조금은 방향이 잡힌 것 같다.강의 내용 중 가장 기억에 남는 것은 SOLID 원칙이다.SRP(Single Responsibility Principle): 단일 책임 원칙 : 하나의 클래스는 하나의 책임만을 가져야 한다. 하나의 기능만을 담당하여 유지보수를 더욱 효율적으로 할 수 있다. OCP(Open Closed Priciple): 개방 폐쇄 원칙 : 확장에는 열려있어야 하며, 수정에는 닫혀있어야 한다. 새로운 변경 사항이 발생했을 때, 확장에 따른 기존 코드의 수정은 최소화 하며, 유연하게 코드를 추가함으로써 기능을 확장할 수 있다. LSP(Listov Substitution Priciple): 리스코프 치환 원칙 : 자식 타입은 언제나 부모 타입으로 교체할 수 있다. 자식의 부모의 기능을 사용해도 동작이 부모 타입에서 의도한대로 흘러가야 한다. ISP(Interface Segregation Principle): 인터페이스 분리 원칙 : 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공한다. 한 인터페이스에 변경이 발생하더라도 다른 인터페이스는 영향을 받지 않도록 한다. DIP(Dependency Inversion Principle): 의존 역전 원칙 : 구현 클래스가 아닌 인터페이스에 의존해야한다. 클라이언트가 인터페이스에 의존해야 유연하게 구현체를 변경할 수 있다.강의를 들으면서 왜 이 5가지의 원칙들이 읽기 좋은 코드를 만드는 데 큰 도움이 되는 지 많이 깨달았다.미션day2 미션 - 추상과 구체의 예시추상과 구체 강의를 들었을 때, 가장 와닿은 것은 '이해'라고 생각한다. 추상화 된 문장을 보았을 때, 머릿속으로는 구체화 된 사건이 떠오르는 것이 제대로 된 추상화가 아닐까? 싶었다. 그래서 흔히 사용하는 추상화 된 문장을 아무거나 하나 생각해내고, 그 과정을 빠진 부분 없이 자세하게 작성해서 추상에 대한 구체를 작성하여 미션을 수행했다. day4 미션 - 자기만의 언어로 리팩토링하기미션에 있는 코드를 봤을 때, 가장 먼저 생각했던 건 일단 복잡성을 줄이기였다. 강의 때 들은 SOLID 원칙이 있지만, 아직까지는 이 원칙들에 대해서 완벽하게 이해를 못했기 때문에 먼저 복잡하게 연결되어있었던 if문을 줄이고, 최대한 이것저것 연결되어 복잡해지지 않게 만들어야 겠다고 생각했다. 그래서 복잡한 코드들을 3가지 조건으로 나눠서 나만의 언어로 리팩토링 했다. 회고day2 강의에서 노래방에 가는 것을 구체화 된 문장으로 설명해주셨었는데 거기서 어찌보면 가장 큰 깨달음을 얻은 것 같았다. 노래방을 간다는 것이 그냥 노래방을 가는 것이지 그렇게 생각해 본 적이 없는데 폐에서 나온 공기가 성대를 통과하면서 만들어진 진동과 같이 구체화 시킨 문장을 보고 나도 모르는 사이에 내 머릿속은 구체화 된 문장으로 생각하고 있었던 것 같다. 그때 추상과 구체에 대해서 조금 더 확실하게 이해를 했었던 것 같다.생각한 코드를 구현하는 것도 물론 어렵지만, 그 코드를 생각하는 단계가 더욱 중요하게 어떻게 보면 더 어렵다고 생각하기에 앞으로 읽기 좋은 코드를 만들기 위해서 스스로 많은 생각을 해봐야겠다고 깨달음을 얻었다.
백엔드
2024. 03. 19.
3
[인프런 워밍업 클럽 BE 0기] 후기
인프런 워밍업 클럽 후기 이제 막 스프링 부트에 대한 지식을 쌓기 시작한 단계라서 이것저것 어려운 점들이 많았는데 이번에 인프런 워밍업 클럽 스터디를 진행한다는 소식을 듣고 지원하게 되었습니다. 솔직히 처음에는 제가 이 스터디를 잘 따라갈 수 있을지도 의문이었고, 중간에 뒤쳐지진 않을까 걱정도 되었습니다. 그런데 의외로 생각했던 것 만큼 어렵지 않았고, 강사님께서도 정말 쉽게 설명해주셔서 이해하는 데 큰 무리가 없었습니다. 또한 7일차에 거친 과제들과 8일차부터 진행한 미니 프로젝트를 통해 배우는 것에서 그치지 않고 직접 실습 하여 조금 더 제 것으로 만들 수 있었고, 이러한 과제들이 제가 강의를 듣는 데에 소홀해지지 않도록 도움을 준 것 같습니다. 또한 중간중간에 진행했던 Q&A를 통해서 공부를 하다가 막힌 부분이나 더 궁금했던 부분에 대하여 강사님께 직접 물어보고 바로 답을 얻음으로써 몰랐던 지식들을 채워나갈 수 있었고, 특히 다른 러너분들께서 질문 하시는 것들이 궁금했던 것 이외에도 도움이 될 만한 질문들이 많았어서 덕분에 여러 지식을 얻는데 큰 도움을 얻었습니다. 이번 3주간의 인프런 스터디의 경험은 스터디를 시작하기 전과 후의 저가 많이 바뀌게 해주었고, 그만큼 저에게 매우 유익한 시간이었습니다. 다른 러너분들과 함께 지식도 공유하고, 계속해서 스터디를 진행한 결과 이전에는 이해하지 못했던 이론이나 깨닫지 못하는 것들을 시간이 지나고서 이해하게 되었고, 스프링 부트의 전반적인 구조에 대해 익힐 수 있었습니다. 덕분에 이제까지는 들어도 무슨 소리지 했던 내용들이 지금에서는 완벽하게는 아니지만 어떤 내용인지에 대해서는 이해할 수 있게 되었을 정도로 성장했음을 느낍니다! 솔직히 가끔 나태해 질 때가 몇 번 있었는데 다른 러너분들께서 적극적으로 질문도 하시고, 과제나 발자국 제출 등 열심히 하는 모습들을 보니 저도 열정을 넘겨받아 더욱 열심히 참여하게 되었습니다. 평소에 혼자 공부하는 편이었어서 하기 싫을 때 그냥 던져 둘 때가 많았었는데 함께하는 러너분들이 있어서 저도 의지가 계속해서 생겨나서 끝까지 도달할 수 있었습니다. 짧지만 정말 좋은 경험이었고, 다음에도 인프런 스터디를 진행하게 된다면 꼭 참여하고 싶습니다!!
백엔드
・
인프런
・
인프런워밍업클럽
・
스터디0기
2024. 03. 10.
0
[인프런 워밍업 클럽 BE 0기] 3주차 발자국
총 3주 간에 걸친 인프런 워밍업 클럽 스터디가 이제 끝을 보이고 있다. 3주 차에는 이제까지 작성한 것들을 배포를 하는 방법과 Spring Boot에 대한 더 자세한 설명, 그리고 추가적인 꿀팁 영상들을 배웠다. 11일 차기본적인 배포를 위한 준비 우리가 이제까지 작성한 코드들은 우리 컴퓨터에 있기 때문에 다른 곳에서 접속이 불가능하다. 그래서 다른 사람이 우리가 만든 프로그램을 사용하려면 전용 컴퓨터에 우리가 만든 코드를 전송해서 다른 사람이 접속하도록 해야 한다. 여기서 배포에 대해 배웠는데 배포란 최종 사용자에게 SW를 전달하는 과정으로 우리는 우리가 만든 도서 관리 프로그램을 배포하기 위해 git, github, AWS의 EC2 등 배포에 필요한 몇몇 과정들을 배웠다. 11일 차의 내용은 이전에 어느 정도 공부했던 부분이 많아서 이해하는데 더 수월했는데 그럼에도 불구하고, 아직 몰랐던 내용이 많았어서 원래 알던 내용에서 더 많은 것을 얻어갈 수 있었다.12일 차AWS와 EC2 배포이제 앞선 11일 차 강의 때 배운 배포를 직접 해보는 것을 실습 했다. 먼저 AWS의 EC2에 접속해서 리눅스 명령어를 다뤄보았고, 배포를 위해 JAVA, MySQL 등을 설치하여 배포를 위한 준비를 마쳤다. 그리고 이제까지 만들었던 것을 실제로 배포를 해 볼 시간이다. 깃허브에서 우리가 작성한 코드를 가져와서 전용 컴퓨터에서 빌드와 실행을 마쳤고, EC2의 IP주소를 통해 다른 컴퓨터에서 전용 컴퓨터의 접속을 수행할 수 있었다. 이제까지 배포를 해보았던 경험은 없었기에 12일 차에서 직접 배포를 해 본 것이 추후 계속해서 서버에 대한 공부를 할 때, 엄청 큰 도움이 될 것 같았다. 그리고 추가적으로 가비아를 이용해서 도메인을 구입해서 DNS를 적용하여 127.0.0.1 같은 IP주소가 아닌 www.inflearn.com같이 도메인을 사용해서 우리가 평소에 자주 사용하는 방식으로도 접속을 해보았다. 이번 강의 덕분에 생애 최초로 배포를 해볼 수 있었던 좋은 경험이 되었다.13일 차Spring Boot 설정, 버전업 이해하기이제 본격적인 자바와 스프링 부트를 이용한 서버 만들기 및 배포는 끝이 났고, 13일 차에서는 Spring Boot의 이런 면 저런 면에 대해서 공부하게 되었다. 우리가 의존성을 설정할 때 사용한 build.gradle파일부터 Spring과 Spring Boot의 차이, application.yml파일, lombok, 마이그레이션 등 조금 더 스프링 부트에 대한 이해를 넓힐 수 있었다. 그 중에서도 lombok의 사용에 대해서 인상 깊게 강의를 들었는데 이제까지 우리가 생성자 및 getter, setter를 직접 만들어 줬었는데 lombok을 사용해서 @Getter 같이 어노테이션 하나 만으로 그 길던 코드를 줄일 수 있다고 생각하니까 코드를 읽는 것이나 작성하는 데 드는 시간을 많이 줄일 수 있다고 느꼈다. 그리고 이제까지 사용은 해왔지만 자세히는 몰랐던 gradle파일이나 yml파일에 대해 자세히 알게 될 수 있었다.14일 차마무리 및 추가 꿀팁 영상이제 3주 간의 스터디의 마지막 강의인 14일 차의 강의가 다가오게 되었다. 마지막 14일 차에서는 수업을 마무리 하는 영상으로 시작해서 추가적으로 우리가 강의를 보면서 궁금했을 법한 내용들에 대해 자세히 설명해주는 강의였다. 확실히 마지막 강의라 그런지 이전보다는 조금 널널한 마음으로 들었지만 그럼에도 불구하고 정말 궁금했던 내용들을 더 알게 해주어서 마지막까지 완벽한 강의였다. 특히 수업 마무리 영상에서 공부 방향성에 대한 강사님의 개인적인 조언이 담겨져 있었는데 정말 이후에 공부하는 데 큰 도움이 된 것 같다.미니 프로젝트간단한 출퇴근 사내 시스템 개발8일 차부터는 이제까지 주던 과제를 통한 문제 풀이 대신, 미니 프로젝트를 진행하였다. 이제까지 공부했던 내용들이 있었으니 처음에는 여유롭게 작성할 수 있지 않을까 라고 생각했었는데 크나큰 착각이었다. 작성하면서도 어? 이렇게 했었나? 라는 생각이 자주 들었고, 힘들게 작성을 마치고도 컴파일 과정에서 문제가 나거나, API를 전송하면서 어디선가 계속 오류가 발생해서 너무 헷갈리고, 어려웠다. 그래도 이전에 봤던 강의 들을 다시 보고, 헷갈리는 내용들을 검색해보면서 프로젝트를 진행해 나갈 수 있었다. 아직 4단계까지 진행하려면 한참 남았지만 이제까지 공부해왔던 내용을 토대로 만들면서 모르는 부분은 검색하거나 주변에 도움을 구하면서 계속 진행하여 완료 해낼 것이다. 회고길다면 길고 짧다면 짧았던 3주 간의 인프런 워밍업 클럽 스터디 BE 0기가 끝이 나게 되었다. 앞서 1~2주차 발자국을 작성하면서 이 스터디가 끝나고 나면 내가 얼마나 변해져 있을 지에 대한 궁금증이 컸는데 마침내 3주차 강의가 끝이 나면서 직접 몸으로 체험하게 되었다. 지금의 내가 3주 전의 나를 보면 그냥 한낱 개미에 불과할 정도로 단기간에 많은 것들을 알게 된 것 같다. 3주 전에는 확실히 아무것도 모르고, 이해도 잘 안됐었는데 지금도 물론 한참 부족하지만 어느 정도는 돌아가는 구조에 대해서 깨닫게 된 것 같다. 비록 스터디는 이제 끝이 나게 되었지만 아직 미니 프로젝트도 4단계까지 남아있고, 스프링 부트에 대해서 모르는 것투성이기 때문에 앞으로도 개인적으로 공부도 하고, 주변에 맞는 사람들과 프로젝트도 진행하면서 조금 더 성장해 나가려 한다. 이제까지 좋은 지식을 얻게 해주신 최태현 강사님과 스터디를 진행해주신 인프런 워밍업 클럽에 감사하고, 다음에도 비슷한 기회가 생기게 된다면 꼭 참여해서 새로운 것들을 많이 배워가면 좋겠다.
백엔드
・
인프런워밍업클럽
2024. 03. 03.
0
[인프런 워밍업 클럽 BE 0기] 2주차 발자국
2주차에는 1주차에서 배운 내용들을 토대로 조금 더 많은 것들을 배워갈 수 있었다. 6일차스프링 컨테이너의 의미와 사용 방법 6일차에는 스프링 컨테이너가 무엇인지, 그리고 어떻게 사용하는 지에 대해 알게 되었다. 우리가 1주차 학습 때 배웠던 Controller에서 3단 분리하여 만들어진 Service와 Repository를 받아오는 과정에서 스프링 빈으로 등록하여 사용하면 따로 연결을 시켜주지 않더라도 필요하면 가져와서 사용할 수 있다는 것을 알게 되었고, 우리가 만든 클래스나 메소드들을 직접 등록해보면서 스프링 컨테이너에 대한 이해를 높일 수 있었다. 6일차 미션 (이전 미션에서 작성한 Controller코드 분리)앞서 작성한 Fruit Controller 코드를 직접 분리하면서 좀 더 좋은 코드를 만들어 볼 수 있었다. 미션을 통해 따라치기만 했던 Service나 Repository 코드를 직접 작성해 보았고, 그 과정을 통해 Controller의 분리에 대해 조금 더 익숙해진 것 같았다. 그리고 @Primary 어노테이션이나 @Qualify어노테이션을 통해 두 Repository를 바꿔가며 작동시킬 수 있도록 코드를 작성해보면서 더 좋은 코드를 만들어 낼 수 있었다. 7일차Spring Data JPA를 사용한 데이터베이스 조작이제까지는 JdbcTemplate를 사용하여 직접 sql 쿼리문을 작성하고, 실행했는데 이러한 것들을 더 쉽고, 편리하게 사용하기 위해 Spring Data JPA에 대해 배웠다. 그 과정에서 JpaRepository의 메소드인 save, delete 등을 알 수 있었고, 확실히 직접 쿼리문을 작성하는 것이 아니라 메소드를 통해서 DB에 접근하여 조작하니 쿼리문의 오타로 인한 실수도 줄어들고, 코드 작성하는 시간도 줄일 수 있어 도움이 되었다. 7일차 미션 (JPA 연습)이제 총 7가지의 미션도 마지막에 다다랐는데 마지막은 Spring Data JPA를 사용하여 이제껏 만들었던 코드를 리팩토링 하는 것이다. FruitController의 각각 기능들을 직접 SQL 쿼리문을 작성하는 것이 아닌 JpaRepository의 메소드를 가져와서 사용함으로써 기능들을 구현해볼 수 있었다. 그리고 객체와 관계의 매핑을 뜻하는 ORM을 통해 우리가 작성한 테이블을 Entity코드와 매핑하여 여러가지 추가하면서 연결 시킬 수 있었고, 그 과정에서 조금 어려움을 겪었는데 어려움을 겪은 만큼 스스로 더 많은 것을 알게 되었다고 느낄 수 있어 좋은 경험이 되었다.8일차트랜잭션과 영속성 컨텍스트만약, 메소드를 실행하다가 도중에 문제가 발생하면 코드는 이제까지 실행한 구문들을 유지한 채 에러를 던지게 된다. 그렇다면 우리가 원하지 않았던 것들도 저장될 수 있는데 그것을 위해 트랜잭션과 영속성 컨텍스트에 대해서 배우게 되었다. 트랜잭션은 쪼갤 수 없는 업무의 단위로 모든 SQL이 성공하거나 또는 SQL이 하나라도 실패하면 원상태로 롤백시키는 것이다. 덕분에 도중에 에러가 발생하더라도 DB가 엉망으로 될 일이 사라졌고, 추가적으로 테이블과 매핑된 Entity 객체를 관리 및 보관하는 역할을 가진 영속성 컨텍스트에 대한 4가지 특수한 능력에 대해 알게 되었다.9일차조금 더 복잡한 기능을 API로 구성하기이제까지 유저 관련 API를 작성하며 DB, 스프링 컨테이너, JPA 등 여러가지 많은 것 들을 배웠는데 이제 지금까지 배운 내용들을 토대로 책 관련 API를 하나 씩 작성해보았다. 유저 API와 책 API는 기능이 다르기 때문에 유저에서는 없었던 여러 기능들을 구현해 볼 수 있었고, 강의를 보기 이전에 API를 먼저 만들어보고 비교 함으로써 부족한 부분이 무엇이고, 어떻게 작성하면 더 좋은 지에 대해 알 수 있는 좋은 기회였다.10일차객체지향과 JPA 연관관계마지막 10일차에서는 우리가 이제까지 배운 것들의 마무리 부분으로 조금 더 객체지향적으로 개발하는 방법에 대해 알게 되었다. 그 과정에서 JPA 연관관계의 추가적인 기능들인 1대1, 1대다, 다대다와 같은 것들을 알 수 있었고, 직접 연관 시켜서 코드를 작성해보니 생각하는 과정에서는 조금 머리가 꼬였지만, 최종적으로 만들고 나서 부터는 코드가 훨씬 가독성이 좋게 작성되었음을 볼 수 있었다. 그 후 이제까지 작성한 API들을 마지막으로 수정하면서 API 작성에 대한 내용들은 끝마치게 되었다.회고벌써 스터디에 참여하고 2주가 지났는데 2주전의 나와 비교하면 정말 하늘과 땅 차이인 것 같다. 1주차에서 부족한 부분들을 2주차에서 배워갈 수 있었고, 공부를 하면 할 수록 새로운 개념들이 나와 역시 개발자의 공부는 끝이 없다는 것을 뼈저리게 느끼는 중이다. 그래도 1주차에 비해서 조금 더 강의에 집중하고, 궁금한 부분들에 대해 더 찾아보고 공부하면서, 조금 더 성장한 느낌이 들었고, 마지막 3주차까지 끝나고 나면 얼마나 변해있을지가 점점 궁금해졌다. 이제 미니 프로젝트를 조금씩 준비하고 있는데 이제까지 열심히 공부한 내용들을 바탕으로 프로젝트 1단계에 만족하지 않고, 계속 공부하면서 최대한 많이 완성해보고 싶다.
백엔드
・
인프런워밍업클럽
2024. 02. 26.
0
[인프런 워밍업 클럽 BE 0기] 6일차 과제
문제 1과제 #4에서 만들었던 API를 강의 내용처럼 Controller - Service - Repository로 분리해보세요!Controller code@RequestMapping("/api/v1/fruit") @RestController public class FruitController { private final FruitService fruitService; public FruitController(FruitService fruitService) { this.fruitService = fruitService; } @PostMapping() public void addFruit(@RequestBody FruitInfRequest request) { fruitService.addFruit(request); } @PutMapping() public void isSoldFruit(@RequestBody FruitSoldRequest request) { fruitService.isSoldFruit(request); } @GetMapping("/stat") public FruitAmountResponse checkSalesAmount(@RequestParam String name) { return fruitService.checkSalesAmount(name); } }Service code@Service public class FruitService { private final FruitRepository fruitRepository; public FruitService(FruitRepository fruitRepository) { this.fruitRepository = fruitRepository; } public void addFruit(FruitInfRequest request){ fruitRepository.addFruit(request); } public void isSoldFruit(FruitSoldRequest request) { fruitRepository.isSoldFruit(request); } public FruitAmountResponse checkSalesAmount(String name) { return fruitRepository.checkSalesAmount(name); } }Repository code@Repository public class FruitRepository { private final JdbcTemplate jdbcTemplate; public FruitRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void addFruit(FruitInfRequest request){ String sql = "INSERT INTO fruit(name, warehousingDate, price) VALUES(?, ?, ?)"; jdbcTemplate.update(sql, request.getName(), request.getWarehousingDate(), request.getPrice()); } public void isSoldFruit(FruitSoldRequest request) { String readSql = "SELECT * FROM fruit WHERE id = ? and is_sold = false"; boolean isFruitNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, request.getId()).isEmpty(); if (isFruitNotExist) { throw new IllegalArgumentException(); } String sql = "UPDATE fruit SET is_sold = true WHERE id = ?"; jdbcTemplate.update(sql, request.getId()); } public FruitAmountResponse checkSalesAmount(String name) { String readSql = "SELECT * FROM fruit WHERE name = ?"; boolean isFruitNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty(); if (isFruitNotExist) { throw new IllegalArgumentException(); } String soldSql = "SELECT sum(price) FROM fruit WHERE is_sold = true GROUP BY name having name = ?"; String notSoldSql = "SELECT sum(price) FROM fruit WHERE is_sold = false GROUP BY name having name = ?"; long salesAmount = jdbcTemplate.queryForObject(soldSql, long.class, name); long notSalesAmount = jdbcTemplate.queryForObject(notSoldSql, long.class, name); return new FruitAmountResponse(salesAmount, notSalesAmount); } }문제 2문제 1에서 코드가 분리되면 FruitController/ FruitService / FruitRepository가 생겼을 것 입니다.기존에 작성했던 FruitRepository를 FruitMemoryRepository와 FruitMySqlRepository로 나누고 @Primary어노테이션을 활용해 두 Repository를 바꿔가며 동작시킬 수 있도록 코드를 변경해보세요FruitServiceprivate final FruitRepository fruitRepository; public FruitService(FruitRepository fruitRepository) { this.fruitRepository = fruitRepository; }FruitRepositorypublic interface FruitRepository { void addFruit(FruitInfRequest request); void isSoldFruit(FruitSoldRequest request); FruitAmountResponse checkSalesAmount(String name); }FruitMysqlRepository@Repository @Primary // 사용할 Reposiroty에 추가 public class FruitMysqlRepository implements FruitRepository{ private final JdbcTemplate jdbcTemplate; public FruitMysqlRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public void addFruit(FruitInfRequest request){ String sql = "INSERT INTO fruit(name, warehousingDate, price) VALUES(?, ?, ?)"; jdbcTemplate.update(sql, request.getName(), request.getWarehousingDate(), request.getPrice()); } @Override public void isSoldFruit(FruitSoldRequest request) { String readSql = "SELECT * FROM fruit WHERE id = ? and is_sold = false"; boolean isFruitNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, request.getId()).isEmpty(); if (isFruitNotExist) { throw new IllegalArgumentException(); } String sql = "UPDATE fruit SET is_sold = true WHERE id = ?"; jdbcTemplate.update(sql, request.getId()); } @Override public FruitAmountResponse checkSalesAmount(String name) { String readSql = "SELECT * FROM fruit WHERE name = ?"; boolean isFruitNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty(); if (isFruitNotExist) { throw new IllegalArgumentException(); } String soldSql = "SELECT sum(price) FROM fruit WHERE is_sold = true GROUP BY name having name = ?"; String notSoldSql = "SELECT sum(price) FROM fruit WHERE is_sold = false GROUP BY name having name = ?"; long salesAmount = jdbcTemplate.queryForObject(soldSql, long.class, name); long notSalesAmount = jdbcTemplate.queryForObject(notSoldSql, long.class, name); return new FruitAmountResponse(salesAmount, notSalesAmount); } }@Primary 어노테이션을 통해 FruitService에서 받는 Repository가 어노테이션을 가진 FruitMysqlRepository가 되도록 함.
백엔드
・
인프런워밍업클럽
2024. 02. 25.
0
[인프런 워밍업 클럽 BE 0기] 1주차 발자국
스프링 부트에 관심이 생겨서 주변인들의 도움이나 여러 강의들을 통해서 조금씩 공부를 하고 있었는데 인프런 워밍업 클럽 스터디라는 기회가 생겨 이 스터디를 통해 아직 제대로 갖춰지지 않았던 기초를 조금 더 다지고 싶고, 공부하면서 놓쳤던 부분들에 대해 복습하고, 더 새로운 지식들을 얻어 가고 싶어 신청하게 되었다. 1일차서버 개발을 위한 환경 설정 및 네트워크 기초 스프링 프로젝트를 시작하는 방법과 네트워크와 HTTP, API에 대한 기본 개념 그리고 실전으로 들어가 GET API를 개발하고 테스트하는 것 까지 학습했다. 그 과정에서 이전에 공부했었던 부분들에 대해 복습할 수 있었고, 직접 테스트해보면서 조금 더 이해할 수 있었다. 1일차 미션 (어노테이션을 사용하는 이유(효과)와 나만의 어노테이션 만드는 법)이제까지 만들어져있던 어노테이션만 계속해서 사용했었는데 직접 어노테이션을 만들어서 사용할 수 있다는 것에 흥미를 느꼈다. 그래서 커스텀 어노테이션에 대해 조사해보면서 만드는 법에 대해 알게 되었고, 이제까지 사용했던 어노테이션들이 어떻게 만들어졌는지에 대한 원리들을 깨달은 좋은 계기가 되었다.[1일차 과제](https://www.inflearn.com/blogs/6573) 2일차첫 HTTP API 개발앞서 배웠던 서버 개발을 위한 기본 환경 설정을 토대로 우리의 최종 목표인 도서 관리 어플의 유저 생성 및 조회 API를 직접 작성해보았다. 그 과정에서 GET API와 POST API가 어떻게 동작하는지에 대해 알 수 있었고, 이런 저런 데이터들을 가지고 테스트를 해보면서 API에 대한 이해를 높일 수 있었다. 2일차 미션 (GET, POST API 만들기)2일차 강의를 보며 익힌 GET API와 POST API의 작성을 스스로 해볼 수 있었다. 기본적인 API 작성에 관한 문제였기에 크게 어렵지는 않았는데 컨트롤러와 DTO 코드를 작성하면서 어떻게 하면 더 좋은 코드를 작성할 수 있을지에 대해 고민하면서 작성한 것 같다. 그리고 평소에 자주 쓰지 않았던 LocalDate 객체를 찾아보면서 주요 메소드들을 사용해 볼 수 있는 좋은 기회였다.[2일차 과제](https://www.inflearn.com/blogs/6592) 3일차기본적인 데이터베이스 사용법 이제 데이터를 데이터베이스에 넣어 서버를 재시작해도 사라지지 않도록 데이터베이스를 사용하는 방법에 대해 학습했다. 테이블을 만들고, 그 테이블에 값들을 넣고 조회하는 SQL 쿼리문을 배웠고, JdbcTemplate를 사용하여 Spring에서 데이터베이스를 사용하는 방법으로 우리가 이전에 작성했던 API들을 수정하였다. 3일차 미션 (자바의 람다식 등장 이유 및 람다식과 익명 클래스의 관계)자바를 공부해오면서 람다식을 사용하기만 했지 왜 람다식이라는 문법이 등장했을까? 라는 의문에 대해서는 생각해 본 적이 없었는데 이번 기회에 람다식에 대해 조금 더 이해할 수 있는 기회가 되었다. 그리고 이제까지 람다식을 단편적으로 사용했는데 조금 더 많은 문법을 알게되어 앞으로 사용에 있어서 더 효과적으로 사용할 수 있을 것 같다.[3일차 과제](https://www.inflearn.com/blogs/6670) 4일차데이터베이스를 사용해 만드는 API4일차에는 3일차에서 배운 Spirng에서 데이터베이스를 사용하는 방법을 통해 우리의 최종 목표인 도서 관리 어플리케이션에서 유저를 업데이트하고 삭제하는 API를 작성해보았다. 그 과정에서 JdbcTemplate의 update메소드와 query메소드를 사용해보면서 데이터베이스에 값을 수정할 수 있었고, 데이터의 부재로 인한 예외 처리는 어떻게 하는지에 대해 알 수 있었다. 4일차 미션 (GET, POST API 만들기2)2일차 미션에서는 데이터베이스에 저장하지 않았었는데 이번에는 2일차 미션에서 더 나아가 JdbcTemplate 메소드를 활용하여 데이터베이스에 값을 저장해보았다. 문제의 풀면서 API에서 long을 사용하는 이유를 찾아볼 수 있었고, SQL문의 sum이나 group by 같은 문법을 통해 더 효과적으로 SQL 쿼리문을 작성할 수 있었다.[4일차 과제](https://www.inflearn.com/blogs/6699) 5일차클린 코드의 개념과 첫 리팩토링 1주차의 마지막 5일차에서는 클린 코드의 중요성과 Controller를 Service와 Repository로 3단 분리하는 방법에 대해서 학습하였다. 클린 코드의 중요성은 처음 코딩을 공부할 때 부터 많이 들어왔었는데 그 중요성에 대해서 이번 강의를 통해 조금 더 확실하게 느낄 수 있었다. 또한 Controller 코드를 분리하면서 최종 완성된 코드를 보니 메소드들이 몰려있던 처음과 다르게 확실히 보는 것이 편해졌고, 각 메소드들이 어떤 역할을 하는 지에 대해 이해가 훨씬 수월했다. 5일차 미션 (코드 리팩토링)최대한 클린하지 않게 작성된 코드를 리팩토링하여 클린하게 개선해 보는 시간을 가졌다. 처음에는 한 클래스에서 코드를 여러 함수로 나눌지, 아니면 클래스를 나눌지 여러 고민을 했는데 고민 끝에 기능을 구현할 함수들만 새로운 클래스를 작성하여 만들었다. 확실히 최초의 코드보다는 훨씬 깔끔했지만 조금 더 클린하게 만들 수 있는 방법에 대해 계속 생각하면서 그러한 생각속에서 많은 것들을 얻을 수 있었다.[5일차 과제](https://www.inflearn.com/blogs/6725) 회고인프런 워밍업 클럽 스터디에 참여하고 벌써 1주 차가 되었는데 아직 초반임에도 불구하고, 정말 많은 것들을 얻어 갈 수 있었다. 스프링 부트에 관련된 지식뿐만 아니라 여러 사람들이 공부하는 방식과 그를 위한 열정들을 보면서 스스로 성장할 수 있었다. 기본 지식부터 시작해 실습과 과제를 통해 그저 머릿속에 넣을 뿐 아니라 활용하는 것을 알게 되었고, 덕분에 조금 더 기억에 남을 수 있었다. 이번 일주일 동안 매일 시간을 내어 강의를 보고, 과제를 작성하고, 공유하면서 꾸준히 해온 나 스스로가 기특하고, 모르는 부분에 대해서 그냥 넘어가지 않고, 계속해서 찾아보는 시간이 무엇보다 값진 시간이었다. 인프런 워밍업 클럽 스터디를 통해 더디게 걸었던 내가 더 힘차게 걸어갈 수 있는 방법을 알게 해주었고, 앞으로 남은 2주 동안 1주차 보다 더 열심히 해서 스터디가 끝나고 나서는 시작하기 전에 모습과 몰라보게 달라진 내 모습을 기대된다.
백엔드
・
인프런워밍업클럽
・
인프런스터디