SOPT에서 합동세미나를 위해 서버 개발을 하면서 비즈니스 로직에 빌더를 호출하여 엔티티를 DTO로 변환하는 과정이 가독성을 떨어뜨리고 번거롭다는 생각이 들었다. 이를 해결할 수 있는 방법으로 MapStruct가 있다는 것을 알게되어 실제 프로젝트에서 활용한 코드를 바탕으로 소개해보고자 한다. 실제로 프로젝트를 진행하며, private로 서비스 코드 내에서 매핑하는 함수를 일일이 만드는 것은 활용도가 떨어지고, 가독성도 떨어진다고 생각했다. MapStruct는 빈 매퍼 클래스를 자동으로 생성해주며, 어노테이션 기반으로 작성된다는 장점이 있다. 같은 기능의 라이브러리로 modelMapper라는 것도 존재한다고 하는데, 이 라이브러리는 써본적이 없기도하고, 리플렉션이 존재하여 MapStruct가 더 성능이 ..
SOPT에서 활동하며 스프링 부트 개발 시 에러 핸들링을 해주어야 할 일이 많이 있었다. 32기 때 이런 에러 핸들링을 스스로 하지 않았고, 앱잼 때도 리드 언니가 미리 해주어 서비스 단에서 커스텀 에러를 던지게 되더라도 우리가 만든 공통 형식으로 잘 찍히는 것만 확인하고 그 원리를 이해하지 않았던 것이 아쉬웠다. 그래서 이번 합동 세미나를 진행하며 에러 핸들링을 했던 것을 정리해보고자 한다 :) 1. Error을 관리할 Enum 과 CustomException 만들기 - API를 작성할 때 따로 Custom Error Handler를 만들어주지 않는다면, Runtime Error 발생 시 모두 500 Error로 Response가 전달되게 된다 { "timestamp": "2023-11-25T22:09..
오늘은 GO SOPT 32기 앱잼을 하며 똑똑하게 기획과 소통하며 프로젝트에서 더미데이터를 쌓을 수 있었던 방법에 대해 기술하려고 한다 사담을 더하자면, 우리 서비스를 요약하자면 건강한 빵집에 대한 정보를 알 수 있고 이 빵집에 대해 리뷰를 남김으로써 다른 사용자와 정보 공유를 할 수 있다 사용했던 기술은 다음과 같다 1. Google Spread Sheet 2. Google API 3. python 4. mysql(AWS의 RDS에 구축했다) 5. chatGPT 1. Google Spread Sheet 기획이 건강한 빵집을 선별하여 필요한 정보를 수집해주었다 서비스에 구축한 데이터베이스에서 필요한 정보 중 이렇게 기획에서 넘겨주어야 할 데이터는 위와 같이 테이블 형태로 미리 양식을 만들어 공유해주었다 ..
[Spring Intro] Section 07. AOP 강의: 김영한의 스프링 입문 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/ # AOP가 필요한 상황 서비스 운영 중 프로그램에 문제가 있는 것 같아 모든 method의 호출 시간을 측정하고자 한다 우리 서비스에는 현재 1000개의 메소드가 있기 때문에 시작과 끝에 시간 측정 로직을 모두 심어야 한다 초 단위로 측정하는 코드를 모두 작성했는데 측정이 잘 되지 않아 밀리세컨드 단위로 바꾸게 되었다 이런 상황에서 모든 메소드의 호출 시간을 다시 바꾸기에는 너무 비효율적이다 따라서..
[Spring Intro] Section 06. 스프링 DB 접근 기술 강의: 김영한의 스프링 입문 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/ # 들어가기 전 이전 포스팅까지는 회원 정보를 메모리에 저장했기 때문에 서버를 껐다 켜면 데이터가 메모리에서 모두 사라졌다 실무에서는 이런 일이 발생하면 안 되기 때문에 데이터베이스를 통해 저장하고 관리해야 한다 이를 위해 H2 데이터베이스를 설치하고, 데이터베이스의 SQL을 통해 애플리케이션 서버와 DB를 연결해 볼 것이다 연결할 때 필요한 것이 바로 Jdbc 기술이며, 오랜 전의 ..
[Spring Intro] Section 05. 회원 관리 예제 - 웹 MVC 개발 강의: 김영한의 스프링 입문 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/ # 회원 웹 기능 - 홈 화면 추가 1. 홈 컨트롤러 추가 java/hello/hellospring/controller/HomeController.java를 다음과 같이 작성한다 @GetMapping("/")에서 "/"는 처음의 도메인(localhost:8080) 경로를 의미한다 return "home"; 구문은 template 내의 home.html을 찾아 반환하는 역할..
[Spring Intro] Section 04. 스프링 빈과 의존관계 강의: 김영한의 스프링 입문 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/ # 컴포넌트 스캔과 자동 의존관계 설정 1. 컴포넌트 스캔과 자동 의존관계 설정 지난 Section3에서 구축했던 백엔드 기능에 화면을 붙여보자. 화면 구축을 위해서는 Controller와 View Template이 필요하다. 그러려면 MemberController를 만들어야 하는데, MemberController는 MemberService를 통해서 회원가입과 데이터 조회가 가능해야 한..
[Spring Intro] Section 03. 회원 관리 예제 - 백엔드 개발 강의: 김영한의 스프링 입문 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/ # 비지니스 요구사항 정리 1. 비지니스 요구사항 데이터: 회원 ID, 이름 기능: 회원 등록, 조회 아직 데이터 저장소가 선정되지 않음(가상의 시나리오) 즉, 어떤 데이터베이스를 사용할지는 정하지 않았다고 가정한다 2. 일반적인 웹 애플리케이션 계층 구조 컨트롤러: 웹 MVC의 컨트롤러 역할 서비스: 핵심 비지니스 로직 구현 ex. 회원은 중복가입을 할 수 없다 리포지토리:..
[Spring Intro] Section 02. 스프링 웹 개발 기초 강의: 김영한의 스프링 입문 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/ # 스프링 웹 개발 기초 정적 컨텐츠: 파일을 그대로 웹브라우저에서 내려주는 것이다 MVC와 템플릿 엔진: 서버에서 HTML을 프로그래밍해 동적으로 내려주는 것이다 API: JSON이라는 데이터 구조 포맷으로 클라이언틍게 데이터를 전달하는 방식이며, 서버끼리의 데이터 통신에도 사용한다 # 정적 컨텐츠 1. 정적 컨텐츠 스프링 부트 정적 컨텐츠 기능: https://docs.spring...
[Spring Intro] Section 01. 프로젝트 환경설정 강의: 김영한의 스프링 입문 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/ # 사전 환경 설정 필자는 맥북 M1 pro를 사용하고 있으며, 강의를 듣다 환경설정 오류를 마주하여 이 글을 읽는다면 자신의 OS에 맞게 설치할 수 있도록 주의하시길 바랍니다 ! 1. 자바 설치 https://www.oracle.com/kr/java/technologies/downloads/#java17 강의 내용을 정리하는 2023. 02. 17 기준으로, 스트링 부트 3.0을 선택하게..