본문 바로가기

분류 전체보기17

[잔디일기] 패키지 구조에 대한 고민 잔디 일기 서비스의 경우 간단한 서비스였기 때문에 1차 기능 구현 기간까지는 비교적 수월하게 진행을 해 왔으나,1. 초반에 팀원 분들과 서로 상의하지 않고 각자 구현했던 패키지 구조로 인해 커져버린 메인 패키지2. 추가해야 할 기능이 늘어남에 따라 중구난방으로 생성되어버린 패키지3. 하나의 기능을 수정하려면 여러 패키지를 수정해야 하는 번거로움해당 부분들 때문에 대규모 패키지 수정이 필요해 보였습니다. 그래서 패키지 구조를 어떤 식으로 고민을 했고, 그래서 어떻게 바꿀 것인지에 대해 적어보았습니다.패키지 구조를 만드는 방식에는 계층형 구조와 도메인형 구조가 있습니다 . 계층형 구조는 쉽게 Controller/Service/Domain으로 나누는 구조로, 다음과 같이 표현되어 서로 메시지를 주고 받습니다... 2024. 5. 10.
[1] 아는 만큼 보이는 백엔드 개발 백엔드 개발자를 준비하면서 어떤 것들을 준비해야하는지 감을 잡을 때, 입문자들을 위한 책이다. 그렇기 때문에 정말 기본지식 정도가 적혀 있었다. 한 가지의 서비스를 만들려면 어떤 flow로 백엔드 개발을 하게되는지 알 수 있다. 가볍게 읽기 좋은 책이었다. REST API 설계 규칙 URI에 동사가 아닌 명사 사용하기 자원의 계층 관계는 /로 나타내기 소문자만 사용하며 명사와 명사를 구분할 때는 -를 사용하기 https://api.sports.com/social_login - X https://api.sports.com/social-login - O 해당 부분은 프로젝트를 진행하면서 놓쳤던 부분이었는데 덕분에 알게 되었다. GraphQL REST API는 중식당처럼 백엔드 개발자가 미리 만들어놓은 API.. 2024. 4. 13.
[토이프로젝트] 잔디일기: 개발하면서 고민했던 부분들 잔디일기 PR#1: 엔티티 생성시 @GeneratedValue 전략과 연관 관계(@mappedBy)잔디일기 PR#2: 엔티티가 LocalDateTime을 사용할 때 날짜별(LocalDate) 검색하기잔디일기 PR#2: 최신순 혹은 오래된순 일기 5개씩 가져오는 방법(Pageable 사용)잔디일기 PR#7: CORS 오류 해결잔디일기 PR#66: 이미지 저장용 AWS S3 서버 구축 후 사용하는 방법잔디일기 PR#74: 이미지 기능 api 사용 방법잔디일기 PR#91: 이미지 기능을 위한 hasImage 변수를 DTO에서 사용해야 할까→ hasImage 변수 없애는 것으로 판단잔디일기 PR#95: [refactor/jwt-exception] jwt 토큰 예외 발생시 SystemException으로 반환→ .. 2024. 4. 13.
[새싹콘서트 2024] 우리는 무럭무럭 자랄 일만 남았으니까 (24.01.03. 수) 우테코 프리코스가 끝나고, 해당 커뮤니티가 유지되는 것과 관련하여 @햅님께서 프리코스 회고 및 발표, 간단한 네트워킹과 팀 빌딩과 같은 세션(aka. 매칭데이)을 기획하시는 것을 보았다. 최근 개발자 네트워킹 모임과 다양한 컨퍼런스를 다녀오면서 해당 경험을 토대로 해당 매칭데이에 기여하고 싶다는 생각을 했다. 마침 @햅님께서 매칭 데이를 위해 TF 팀을 모집하는 것을 보고 바로 지원 하게 되어 기획팀으로서 합류하게 되었다. 저는 기획팀으로서 이런 준비를 도왔어요. 매칭 데이 전반 기획 매칭 데이 정식 명칭 정하기 → 새싹콘으로 결정 새싹콘 진행 날짜 정하기 → 24.01.03.(수) 새싹콘 포스터 기획 방향 정하기 → 디자이너분의 합류 새싹콘 랜딩 페이지 기획 돕기 UX/UI 담당하는 분이 계셔서 그 분.. 2024. 4. 13.
[Java 16] 레코드(record)를 알아보자 record란? 간단히 설명하자면 "데이터 클래스"이며 순수하게 (불변)데이터를 보유하기 위한 특수한 종류의 클래스다. 이를 사용하면 데이터를 객체 간에 전달하는 작업을 간단하게 만들어준다. JDK14에서 preview로 등장하여 JDK16에서 정식 기능으로 포함 예시 String 값으로 name, Integer 값으로 age라는 변수를 갖고 있는 User라는 클래스 구현한다고 가정하자. 일반 클래스로 구현한 User 클래스 public class User { private final String name; private final Integer age; public User(String name, Integer age) { this.name = name; this.age = age; } public S.. 2024. 4. 13.
[Java] JVM의 Garbage Collector JVM(Java Virtual Machine)이란? 운영체제의 메모리 영역에 접근하여 메모리를 관리하는 프로그램 메모리 관리, Garbage Collector 등을 수행하게 된다. Garbage Collector란? 동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능을 맡고 있다. C, C++의 경우 사용자가 직접 메모리를 할당 받고, 해제해야 한다.(malloc(), free()와 같은 함수를 사용) 하지만 Java에서는 GC의 기능이 Heap 메모리에서 unreachable한 객체를 자동으로 삭제 해 준다. (참고) Heap과 Stack은 또 뭐지? Stack 정적*으로 할당한 메모리 영역 원시 타입의 데이터가 값과 함께 할당, Heap 영역에 생성된 Object 타입의 데이.. 2024. 4. 13.
DTO를 사용하는 이유와 설계 방법 DTO란? DTO(Data Transfer Object)란 계층간 데이터 교환을 하기 위해 사용되는 객체로 Getter/Setter만 가진 클래스 주로 View와 Controller 사이에서 활용 데이터 전달만을 위한 객체이므로 java-record로 구현하면 좋음 도메인 대신 DTO를 사용하면 좋은 이유 DTO 대신 도메인 모델을 계층간 전달에 사용하면 도메인 모델을 캡슐화 하여 보호할 수 있다. view마다 필요한 정보가 다른데, 도메인 모델의 경우 필요하지 않은 정보까지 갖고 있기 때문이다. 해당 사진은 MVC 패턴(출처-위키백과)을 간략하게 나타낸 사진이다. MVC 패턴에서 Controller는 Model과 View 사이에서 데이터를 주고 받는다. 이 과정에서 Model을 바로 Controller.. 2024. 4. 13.
일급 컬렉션(First Class Collection)을 사용하는 이유 일급 컬렉션이 뭔데? 컬렉션과 관련된 로직을 캡슐화하는 디자인 패턴 Collection을 Wrapping 하면서 그 외의 다른 멤버 변수가 없는 상태 그렇기 때문에 일급 컬렉션은 다음과 같은 요소들로 구성 된다. 컬렉션 자료형의 인스턴스 변수 컬렉션 자료형의 인스턴스 변수에 잘못된 값이 할당되지 않게 막고, 정상적으로 조작하는 메서드 예를 들면 다음과 같다. List member = new ArrayList(); member.add(new User("길동","주소1")); member.add(new User("예슬","주소2")); member.add(new User("지수","주소3")); 해당 코드를 wrapping 하여 일급 컬렉션을 만들어 보자. private List member; public .. 2024. 4. 13.