분류 전체보기
-
스프링 : 세터(setter) 사용시 문제점백엔드 : 서버공부/Spring 2024. 3. 2. 15:57
이번 포스팅은 특별한 내용이 아니라, 김영한님의 강의의 내용중에 개발시 앞으로 기억해야할 부분이 있어서 기록용으로 작성하게 되었습니다. 혼자 스프링부트에서 엔티티를 다룰 때, '세터(setter)' 메서드를 통해 객체의 상태를 변경하는 방식으로 코드를 작성할 때가 있습니다. 예를 들어, `setName()`, `setAge()`, `setEmail`와 같은 메서드들이 그 예입니다. 이러한 방식은 간단하고 직관적으로 보일 수 있으나, 객체의 상태 변경을 추적하기 어렵게 만들 수 있는 단점이 있습니다. 협업을 하거나 나중에 프로젝트 규모가 커지면 어느지점이 변경지점인지 찾기 어려워서 유지보수성이 떨어질 수 있습니다. 세터(setter)를 통한 상태 변경의 문제점 1. 변경 포인트 추적의 어려움: 객체의 상태..
-
스프링 : BindingResult 를 통한 에러 처리해보기백엔드 : 서버공부/Spring 2024. 2. 19. 15:39
웹사이트에서 사용할 회원가입기능을 구현한다고 생각해봅시다. 여기서 설계를 할때 이름은 필수로 입력받도록 처리했다는 가정을 해보겠습니다. 코드로 서의 구현은 다음과 같습니다. @Getter @Setter public class MemberForm { /** * 이 어노테이션을통해 값이 비어있으면 오류가 발생하게 해줍니다 * */ @NotEmpty(message = "회원 이름은 필수 입니다") private String name; private String email; private String age; } @NotEmpty 어노테이션을 통해 name 필드에 어떠한 값도 넘어오지않으면, 유효성 검사 오류를 터뜨리도록 하였습니다. 그런데 이렇게 처리하면 문제가 있습니다. 클라이언트 측에서 이름을 누락하고 값..
-
스프링 : Java 스트림의 map() 메서드 사용백엔드 : 서버공부/Spring 2024. 2. 13. 23:13
스프링과 직접적으로 관련있는 글은 아니지만, 제가 자주 사용하게 되는 문법이라 기록해두고자 작성하게 되었습니다. 오늘 기록할 문법은 map() 메서드입니다. Java 8부터는 stream 통해 간편하고 효율적으로 데이터를 처리할 수 있습니다. 그 중에서도 map() 메서드는 스트림의 각 요소를 다른 요소로 변환하는 데 사용됩니다. 사용법 map() 메서드의 기본적인 사용법은 다음과 같습니다. stream.map(element -> 변환식) 여기서 stream은 스트림 객체를 나타내며, element는 스트림의 각 요소를 가리키는 변수입니다. 변환식은 각 요소를 변환하는 데 사용됩니다. 이 변환식은 람다 표현식으로 표현되며, 다음과 같은 구조를 가집니다. (element) -> { 변환 로직 } eleme..
-
스프링 : PersistenceContext(영속성 컨텍스트)백엔드 : 서버공부/Spring 2024. 2. 12. 23:17
영속성 컨텍스트란 JPA가 엔티티를 영구 저장하는 환경을 말합니다. 쉽게말해서 JPA가 엔티티를 추적하고 관리하는 영역입니다. 이 환경에서 엔티티는 영속 상태로 관리됩니다. 예를들어 영속성 컨텍스트에서 Member 엔티티를 저장하면, 해당 엔티티는 영속성 컨텍스트 내에 존재하게 됩니다. 다시말해 JPA가 그 엔티티를 '기억'하고 있게 됩니다. 트랜잭션이 커밋되면 JPA가 영속성 컨텍스트에 있는 엔티티를 데이터베이스에 반영합니다. 따라서 Member 엔티티를 영속성 컨텍스트에 저장하면, 해당 엔티티는 트랜잭션이 커밋되는 시점에 데이터베이스에 삽입됩니다. @Repository @RequiredArgsConstructor public class MemberRepository { @PersistenceConte..
-
스프링 : CascadeType.ALL 사용해보기백엔드 : 서버공부/Spring 2024. 2. 11. 23:38
스프링을 공부하고 프로젝트를 진행하면서 JPA를 사용하게됬는데 이때 연관된 엔티티들을 데이터베이스에 저장, 수정 또는 삭제할 때, 이러한 작업들을 각각 수행해야 하는 번거로움이 있었습니다.(번거로움 + 수작업 누락으로인한 오류발생) 예를 들어, 하나의 주문(Order)이 여러 주문 항목(OrderItem)과 하나의 배송 정보(Delivery)를 포함하는 상황을 생각해보면, 주문을 데이터베이스에 저장할 때, 주문 뿐만 아니라 모든 주문 항목과 배송 정보도 함께 저장해야 합니다. 이 과정이 수동으로 진행된다면, 코드는 불필요하게 복잡해지고, 데이터 일관성을 유지하는 것이 어려워집니다. 이러한 문제의 해결책으로 `CascadeType.ALL` 이 있다는 것을 알게되었습니다. JPA에서 CascadeType.A..
-
서버공부 시작 { HTTP } : 간단한 웹서버 띄우기백엔드 : 서버공부 2023. 10. 2. 14:06
Java를 이용해서 간단한 웹서버를 띄워볼 것입니다. 완전한 서버를 구축하기 위해서는 다른 역할을 수행하는 클래스들이 많이 필요하지만, 여기서는 많은 클래스들 중 RequestHandler를 통해 HTTP 메세지를 읽고 쓰는 등의 처리하는 과정을 살펴보겠습니다. 먼저 전체 코드는 아래와 같습니다. package webserver; import db.MemoryUserRepository; import db.Repository; import model.User; import http.util.IOUtils; import http.util.HttpRequestUtils; import java.io.*; import java.net.Socket; import java.nio.file.Files; import j..
-
서버공부 시작 {프로토콜 공부} : TCP/UDP부터 HTTP/HTTPS백엔드 : 서버공부/NetWork 2023. 9. 27. 00:41
HTTP 와 HTTPS 를 학습하기위한 빌드업. TCP / UDP TCP UDP (UDT 아님) TCP는 통신에 있어서 아주 중요한 프로토콜입니다. IP만으로 데이터를 주고 받기에는 문제가 많은데, 먼저 전송할 데이터가 큰 경우 인터넷 대역폭을 너무 많이 차지하는 문제가 있습니다. 그래서 TCP는 데이터를 작은 단위인 패킷으로 쪼개서 보냅니다. 패킷으로 나누어진 데이터들은 전송될때 유실되거나 순서가 섞일 수 있는데, TCP는 순서보장 및 재전송 등의 기능을 통해 오류를 검출하고 재전송을 송신자 측에 재전송을 요청하는 등 통신의 신뢰성을 보장합니다. UDP도 통신에서 중요한 프로토콜 입니다. 비연결형 프로토콜이라고 불리는 UDP는 패킷이 제각각 다른 경로로 이동합니다. 순서보장이나, 병목현상을 방지하기위한..
-
서버공부 시작{ TCP/IP } : 인터넷의 열쇠백엔드 : 서버공부/NetWork 2023. 9. 2. 17:29
인터넷의 열쇠 TCP/IP 물리적으로 떨어져 있는 컴퓨터와 장치들이 서로 통신하고 데이터를 교환하는 것은 지금 우리 생활에서 무척이나 중요한 역할을하고 있고 당연한 일입니다. 하지만 몇 십 년 전까지만 해도 이러한 컴퓨터 간 통신은 큰 어려움을 동반한 일이었습니다. 그 동안 데이터를 공유하거나 통신하기 위해서는 복잡한 방법들과 많은 과정이 필요했습니다. 그런데, 이 모든 것이 바뀌었던 시점이 있었습니다. 1960년대 후반과 1970년대 초반, 전세계적으로 컴퓨터 네트워크가 확장되면서 'TCP/IP'라는 개념이 등장하게 되었습니다. 이 개념은 현재까지도 네트워크 통신의 기초를 이루는 중요한 요소 중 하나로 자리 잡고 있습니다. TCP/IP는 "Transmission Control Protocol/Inter..