전체 글 179

LSP

20241229Liskov Substitution Principle, LSP *"상위 클래스 사용하던 자리에는 하위 클래스 사용할 수 있다"*상위 클래스의 객체를 사용하는 모든 곳에서 하위 클래스의 객체로 대체하더라도 프로그램의 동작이 바뀌지 않아야 한다.==하위 클래스는 상위 클래스를 대체할 수 있어야 한다. ==상위 클래스가 기대하는 동작(계약)을 하위 클래스가 깨지지 않도록 동작해야 한다는 원칙상위 클래스의 역할을 유지해야함 상위 클래스의 메서드와 동작은 하위 클래스에서도 **동일하게 작동** 해야 함 하위 클래스는 상위 클래스가 가진 동작의 **의미**를 바꾸거나 깨뜨리면 안 됨.대체 가능성 보장 코드에서 상위 클래스를 사용하던 자리(메서드 호출, 변수 등)에 하위 클래스를 넣어도 **플고그..

Java 2024.12.29

쿠키 옵션

쿠키 옵션: HttpOnly, Secure, SameSite 1. HttpOnly설명:HttpOnly 옵션이 설정된 쿠키는 JavaScript로 접근할 수 없도록 설정브라우저는 이 쿠키를 서버로의 HTTP 요청에만 사용하며, 클라이언트 측 스크립트에서는 쿠키를 읽거나 수정할 수 없음주요 목적:XSS(Cross-Site Scripting) 공격 방지:XSS는 악성 스크립트를 통해 클라이언트의 쿠키를 탈취할 수 있는 취약점임HttpOnly 쿠키는 JavaScript에서 접근할 수 없기 때문에 탈취 방지에 효과적설정 예시 (HTTP 응답 헤더):Set-Cookie: sessionId=abc123; HttpOnly2. Secure설명:Secure 옵션이 설정된 쿠키는 HTTPS 프로토콜을 사용하는 경우에만 전송..

기타 2024.12.26

시큐리티 요청 흐름 with GPT

시큐리티는 완존히 문외한이라 뭔 얘길 해도 알아먹을 수가 없다공부...를 ... 해야... 한...다..... 틀릴 수도 있음... 1. 클라이언트 요청사용자가 애플리케이션에 요청(예: /profile 경로).2. FilterChain을 통한 요청 처리요청은 Spring Security의 FilterChain을 통과주요 필터:SecurityContextPersistenceFilter: 기존 SecurityContext를 복원UsernamePasswordAuthenticationFilter: 사용자 인증 처리(예: 로그인 요청 처리).기타 필터: 권한 확인, 세션 관리, CSRF 보호 등 추가 작업 수행.3. AuthenticationProvider를 통한 인증AuthenticationManager가 Au..

Spring 2024.12.25

리스트처리(for -> forEach), switch (enum), Null(Optional)

1. 리스트 처리 - IndexOutOfBoundsException 방지잘못된 코드 (전통적인 for문 사용)import java.util.List;public class IndexErrorExample { public static void main(String[] args) { List names = List.of("Alice", "Bob", "Charlie"); for (int i = 0; i  i 코드 작성자가 실수하기 쉬움좋은 코드 (Stream forEach 사용) import java.util.List;public class SafeIterationExample { public static void main(String[] args) { List..

Java 2024.12.25

추상화....인터페이스...

https://multifrontgarden.tistory.com/315 올바른 추상화와 인터페이스 설계이번엔 특별히 무언가 주제가 있다기보다 실무에서도 쉽게 접하는 상황에서 어떻게 인터페이스를 설계하는게 올바른지 예제를 통해 알아가보려 한다. 지난 포스팅의 후속작정도 될 것 같다. #multifrontgarden.tistory.com 인터페이스interface SocialLogin { void login(String clientKey); // 공통된 기능만 정의} 구현클래스class NaverLogin implements SocialLogin { private String userId; private boolean isAgreed; public NaverLogin(String us..

Java 2024.12.24

클라이언트 ip 가져오기

request.getClientIP() 로컬에선 문제가 없었으나 올리고 나니 문제가 생겼다.  백서버가 2개 있고, 로드밸런서가 있는데..  클라이언트 ip를 응답 데이터에 넣기 위해 request.getClientIP()그대로 썼더니 첨보는 ip가 튀어나온다.. 지피티가 로드밸런서나 프록시 ip로 예상된다고 알려준다.   x-forwarded-for 헤더가 안보인다.request.getHeader("X-Forwarded-For"); 를 로그로 찍어봐도 안나온다.따라서 설정이 안돼있다고 예상했다. 네, 로드밸런서에 X-Forwarded-For 헤더 추가 설정을 하면, request.getHeader("X-Forwarded-For")로 클라이언트 IP를 제대로 가져올 수 있을 가능성이 높습니다.현재 상황에..

Java 2024.12.24

추상 클래스 / 인터페이스

추상 클래스는 공통된 메서드와 필드를'상속받는 하위 클래스'에서 재사용하거나 활용할 수 있도록 설계된다. 구현된 메서드와 추상 메서드(구현되지 않고 하위 클래스에서 구현해야만 하는 메서드)를 모두 가질 수 있고,주로 상향식 설계에서 사용되며,관련 클래스 간 공통된 기능을 모아 캡슐화하고 코드 재사용성을 높이는데 유용하람쥐인터페이스는 클래스가 구현해야 할 메서드를 미리 선언만 하고,실제 구현을 구현하는 클래스에 위임한다. 다중 구현이 가능하고, 클래스가 특정 행동(메서드)을 반드시 구현하도록 강제하고 싶을 때 !! 밀이하향식 설계에 적합하다고 볼 수 있다 즉, 추상 클래스는 "공통된 기능을 캡슐화"하는 데 중점을 두고, 인터페이스는 "행동 규약을 강제"하는 데 초점이 맞춰져 있다람쥐추상 클래스 추상 클래스..

Java 2024.12.20

빈약한 도메인 모델 vs 풍성한 도메인 모델

빈약한 도메인 모델 (Anemic Domain Model)특징VO(또는 엔티티): 데이터를 담는 역할만 함. (getter/setter 중심)비즈니스 로직은 서비스 계층에 존재.장점객체가 단순하고 테스트하기 쉬움.서비스 계층에서 로직을 한눈에 파악 가능.단점도메인 객체가 비즈니스와 분리됨 → 로직 응집도가 낮아짐.도메인 객체의 사용 의도가 불명확할 수 있음.풍성한 도메인 모델 (Rich Domain Model)특징도메인 객체가 데이터를 담고 비즈니스 로직도 포함.서비스 계층은 도메인의 비즈니스 메서드를 호출하여 작업 위임.장점도메인 객체가 비즈니스 로직을 캡슐화 → 높은 응집도.도메인 중심 설계(DDD)에 적합.단점설계 복잡도 상승.객체 간 의존성이 증가할 가능성 있음.VO와 DTO의 역할 구분VO (V..

Spring 2024.12.19

ServletResponse.isComitted(), FilterChain (with GPT)

ServletResponse.isCommitted()ServletResponse.isCommitted() 메서드는 Java의 Servlet API에서 응답(Response)이 클라이언트로 전송되었는지 확인하는 메서드임.역할 및 동작isCommitted() 메서드는 응답의 헤더 또는 본문 내용이 이미 클라이언트로 전송되었는지 여부를 boolean 값으로 반환함.응답이 커밋되었으면 true, 아직 클라이언트로 전송되지 않았다면 false를 반환함.주요 특징커밋의 의미:HTTP 응답이 커밋된다는 것은 응답 헤더와 상태 코드가 클라이언트로 전송되었다는 것을 의미함.일반적으로, 첫 번째 바이트가 응답 본문에 기록되면 응답이 커밋됨.또는 flushBuffer() 메서드가 호출되면 강제로 커밋됨.커밋 후 작업 제한:..

Spring 2024.12.19