썸네일 S3U2 [Spring MVC] 서비스 계층 [서비스 계층에서의 DI] 🦖 서비스 계층은 도메인 업무 영역을 구현하는 비즈니스 로직과 관련있다. 보통 Controller로 주입되어 사용된다. Controller 핸들러 메서드의 책임과 역할을 생각해보면 DTO-Entity 간의 변환 작업이 해당 메서드에서 이루어지는 것은 바람직하지 않다. 그래서 보통 매퍼 클래스를 따로 생성해서 매핑을 진행한다. 도메인이 늘어날 때마다 일일이 매퍼를 작성해야하는 번거로움이 문제가 되는데, 이를 해소해주는 라이브러리가 매핑 라이브러리들이다. 그 중에서도 MapStruct를 사용했다. ModelMapper라는 라이브러리도 많이 쓰인다고 하는데, 런타임 시점에 리플렉션 API를 이용해 매핑을 진행하기 때문에 컴파일 시점에 생성되는 MapStruct보다 성능 면에서 뒤쳐진..
썸네일 S3U1 [Spring MVC] API 계층 회고 [Spring MVC 아키텍처] 🥑 Spring Framework를 구성하는 모듈 중 서블릿 API를 기반으로 웹 요청을 처리하는 모듈이 있다. 바로 spring-webmvc이다. 지난 회고에서도 살짝 정리해보았지만, 자체 MVC 프레임워크를 제공하고 웹을 담당하는 모듈이다. 클라이언트의 요청을 처리해준다고 볼 수 있겠다. 그렇다면 MVC는 무엇을 의미할까? Model: 클라이언트에게 돌려주는 작업 처리 결과 데이터이다. View: Model 데이터를 이용해서 클라이언트 화면에 보여지는 리소스를 제공한다. view 형태에는 여러가지가 있는데, HTML페이지(JSP와 같은 SSR에서 사용된다) / PDF나 Excel 등의 문서 / XML, JSON 등 특정 포맷으로 변환된 형태(주로 CSR) 크게 세 가지..
썸네일 SEB BE 42기 Section 2 회고 🤸 어느새 Section 2를 전부 마쳤다. 이번 섹션에서는 자료구조와 알고리즘, 네트워크, 관계형 데이터베이스, 그리고 Spring 기초를 학습했다. 돌이켜보면, 첫 유닛인 재귀부터 엄청난 멘붕을 겪었던 기억이 있다. 원래 재귀라는 것에 대한 개념은 알고 있었지만, 직접 사용해본 적이 없다고 해도 무방했기 때문에 처음에 많은 어려움을 겪었다. 거기다 문제에 적용을 해서 사용하려니 더 어려웠다. 사실 정말 힘들었다. 재귀함수는 그 동작이 다른 로직에 비해 직관적이지 못했다. 원래 리턴값을 들고 돌아가면 바로바로 그 값으로 다른 작업을 수행하면 됐는데, 다시 같은 지점으로 돌아가버리니까 지금 내가 어디까지 왔는지, 또 어디로 되돌아가고 있는지에 대한 파악이 가장 어려웠다. 그래서 직접 그려가면서 흐름을 파..
썸네일 S2U7-U8 [Spring Core] Spring Framework 회고 [Spring Framework 소개] 💚 프레임워크(Framework)는 애플리케이션을 만들기 위한 틀/구조를 제공한다. 프레임워크가 제공하는 일정한 요소와 규약을 가지고 코드를 작성하기 때문에 개발자는 애플리케이션 핵심 로직을 개발하는 것에 집중할 수 있다. 반면 프레임워크에 대한 학습이 필요하고 자유롭고 유연한 개발이 어렵다. 라이브러리(Library)는 애플리케이션을 개발할 때 필요한 기능을 미리 구현놓은 집합체로, 코드 내에서 필요한 기능이 있을 때 개발자가 해당 라이브러리를 호출해서 사용한다. (= 애플리케이션 흐름의 주도권을 개발자가 갖는다.) 반면 프레임워크는 애플리케이션 흐름의 주도권을 갖는다. 핵심 개념: IoC(제어의 역전, Invension Of Control) Java 기반 프레임..
썸네일 S2U6 관계형 데이터베이스 회고 [Database & SQL] 💟 데이터를 저장할 때 인메모리 혹은 CSV 형식 등 File I/O를 사용하게 되면 큰 문제점이 존재한다. 인메모리 방식은 프로그램 종료와 함께 데이터가 사라진다는 점이고, File I/O의 경우 필요한 데이터만 추출하는 것이 아니라 우선 전체를 읽어와야 하기 때문에 비효율적이라는 점이다. 데이터베이스에 대용량의 데이터들에 관계를 부여해 관련 정보만을 추출하고 관리한다면 효율적인 데이터 관리가 가능하다. 데이터베이스에서 데이터를 조작(CRUD)하기 위해 SQL이라는 프로그래밍 언어를 사용한다. 이는 관계형 데이터베이스에서 사용된다. 데이터끼리의 관계나 구조 등을 고정해두지 않은 데이터베이스(NoSQL)도 존재한다. 이는 SQL을 사용하지 않는다. [SQL] 💟 SQL의 기..
썸네일 S2U5 [네트워크] HTTP 회고 [REST API] 🪄 REST API란 REST 아키텍처를 따르는 API라고 할 수 있다. 그렇다면 REST 아키텍처는? 웹에서의 통신을 위한 제약조건의 집합이다. 웹의 장점을 최대한 활용할 수 있는 아키텍처이기도 하다. (로이 필딩의 논문에서 처음 소개되었다) 저자는 이 제약조건을 모두 지켜야 REST하다고 할 수 있다고 한다😓 REST API에서 데이터나 자원은 URI로 식별되어야 한다. 행위는 HTTP 메서드(GET/POST/DELETE 등)로 전달하면 된다. REST를 통해, 서버와 클라이언트를 독립적으로 진화시켜갈 수 있다는 것이 큰 핵심인 것 같다. (웹페이지와 브라우저처럼?) 좋은 REST API를 디자인하기 위한 방법론이 있는데 이는 리차드슨의 REST 성숙도 모델에 잘 표현되어있다. 총..
썸네일 S2U4 [네트워크] 웹 애플리케이션 작동 원리 회고 [웹 애플리케이션] 🏓 웹 애플리케이션은 웹 브라우저를 통해 동적인 응답을 가능하게 하는 애플리케이션이다. 모바일 등 특정 기기에 설치해서 사용해서 사용하는 네이티브 애플리케이션에 비해 유지관리가 쉽고 설치나 다운로드가 필요없다. 하지만 비교적 속도가 느리고 보안적으로 노출되기 쉬운 환경에서 동작한다. 처음에는 네이티브라는 용어 조차 몰라서 앱개발자와 소통이 어려웠던 기억이 있다. (진짜 어떻게 일했을까...?) 암튼 서로 장단점을 보완하며 점점 발전해나가고 있으니 두 개념에 대한 이해가 필요할 것 같다고 생각한다. 하이브리드도 많이 만들어지고 있으니 네이티브와의 통신도 조금 더 공부해보고싶다. (이건 나중에) [네트워크를 만드는 기술] 🏓 IP는 패킷 교환 네트워크(네트워크 계층)에서 정보를 주고받는 ..
썸네일 S2U3 코딩 테스트 준비 회고 [의사코드(pseudocode)] 🎰 문제를 해결할 때 대충 생각하고 해결하지 않도록 해야한다. 잡아둔 문제 해결의 틀을 자연어로 먼저 작성해놓으면 실제로 구현하기가 수월해진다. 그것이 의사코드이다. 자연어 자체로, 혹은 if / while등 자바 문법을 섞어가며 작성해도 된다. 원래도 주석으로 틀을 잡아두고 작업을 하긴 했지만, 조금 더 올바른 의사코드를 작성할 수 있게 되었다. 최대한 로직의 틀을 많이 잡아두고, 조건도 설정해두고 그걸 구현하는 식으로 코드를 작성하게 되었다. [시간복잡도(Time Complexity)] 🎰 연산 횟수의 변경에 따라 소요 시간이 얼마나 증가하는지를 시간복잡도로 표현한다. 시간복잡도의 표기법에는 세 가지가 있다. 빅오(최악의 경우), 빅오메가(최선), 빅세타(평균)이다...
썸네일 S2U2 [자료구조/알고리즘] 자료구조 회고 [Stack] 🛒 Stack은 입출력이 한 쪽에서 이루어지는 자료구조이다. FILO(First In Last Out) = LIFO 방식이다. 데이터를 넣는 것은 push, 꺼내는 것은 pop이다. 대표적인 사용 예는 브라우저 구현이다. 버튼을 누르면 현재 페이지 기준 바로 직전에 보았던 페이지로 이동한다. 가볍게 자료구조 강의를 들으면서 구현해본 적이 있던 터라 이해하기는 수월했다. 다만 그래프 탐색에서 활용하거나 하는 데에 쉽게 활용을 못 한다는 점...?? 많이 쳐보고 연습해본다면 해결될 문제일 거라 생각한다! 그나저나 옛날에 stack it up 많이 들었는데ㅎㅎㅋㅋ [Queue] 🛒 Queue는 입출력이 양쪽에서 이루어진다. 하지만 입출력 방향은 한 쪽으로 고정되어 있어, 가장 처음 들어간 데이터..
썸네일 S2U1 [자료구조/알고리즘] 재귀 회고 [재귀 함수] 😵‍💫 재귀 함수란, 자기 자신을 호출하면서 반복적인 기능을 수행하는 것이다. 반복적인 작업이 필요한 문제를 보다 간결한 코드로 표현할 수 있게 된다. 반복문과 달리 코드를 직관적으로 이해하기는 어렵다. 메서드 반복 호출에 따라 stack을 과도하게 사용하여 메모리를 많이 잡아먹기도 한다. 그럼에도 변수를 여러개 사용할 필요가 없고 간결하다는 장점이 있다. 일반적인 템플릿은 Base case와 Recursive case로 나누어 작성하는 것이다. 문제를 작게 쪼개 더이상 쪼갤 수 없는 경우의 수를 구한다면 탈출 조건을 설정 가능하다. 이를 Base에 작성하고, 작게 쪼갠 문제를 해결할 수 있는 코드를 Recursive에 적어주는 것이다. 하지만 너무 일반적인 템플릿에만 맞추어 작업한다면 사..
썸네일 SEB BE 42기 Section 1 회고 🤸 부트캠프를 시작한지 거의 한 달이 되어간다. 프로젝트를 제외하고 섹션 네 개 중에 한 개를 끝냈다. 끝내버렸다🥶 돌이켜보면 나는 맨 첫 시간 메타인지에 대해 알게 되었고, Html과 Css를 배웠고, Linux, Git을 거쳐서 Java를 굉장히 빠른 속도로 학습했다. 그동안 페어 프로그래밍이라는 신세계도 경험했고, 코로나에 걸려서 거의 멘붕에 빠져버린 때도 있었고, 오늘은 섹션 1의 내용을 주제로 한 모의면접도 진행했다. 민망해서 아직 영상은 열어보지 못했다.ㅋㅋ 친구들 만나서 정말정말 술마시고 놀고 싶은데, 애써서 시간을 낸다 해도 다음날까지 버려버리는 나를 알기 때문에... 쉽사리 약속도 잡을 수가 없었다. 그렇다고 마시지 않은 것은 아니다🌈^^💖 마냥 재미있고 의욕 넘치던 마음들이 게을러져버린..
썸네일 S1U10 [Java] 심화(Effective) 회고 [애너테이션(Annotation)] 🧬 프로그램에게 코드에 대한 정보를 제공한다. 특정 클래스, 메서드 등 타겟이 정해져 있고 그 외에는 영향을 주지 않는다. 표준 애너테이션과 메타 애너테이션이 있다. 사용자 정의 애너테이션도 있는데 깊게 학습하지 않았다. @interface 타입으로 생성하여 애너테이션을 생성하는데, 다른 클래스나 인터페이스를 상속받지 못한다. (이미 자동으로 Annotation 인터페이스를 상속받았다) 표준 애너테이션은 자바에서 기본 제공하는데, 컴파일, 런타임 등에 무언가를 알리는 데에 많이 사용된다. 대표적으로 @Override(컴파일러에게 오버라이딩 한 메서드임을 알림), @SuppressWarnings("all")(컴파일러에게 경고메세지를 나타내지 않아도 됨을 알린다), @De..