Java 20

@PostMapping은 사실 @RequestMapping(method = RequestMethod.POST)의 단축 버전

@PostMapping은 사실 @RequestMapping(method = RequestMethod.POST)의 단축 버전 @PostMapping은 Spring 4.3부터 추가된 단축 어노테이션// 요거@PostMapping("/upload")// 이거랑 완전히 같음@RequestMapping(method = RequestMethod.POST, value = "/upload")  @Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documented@RequestMapping(method = RequestMethod.POST)public @interface PostMapping { String[] value() default {}; ..

Java 2025.04.08

Wrapper Class

​객체처럼 쓰기 위해객체처럼 써야 할 때 기본형을 감싸는 역할기본형 (int)은 가볍고 성능이 좋다.하지만 객체로 다룰 수 없다따라서 컬렉션 (List, Map 등)에는 넣지 못한다.래퍼 클래스 (Integer)는 기본형을 객체로 감싸서 컬렉션에 넣거나null을 다룰 수 있게 해준다.또 자동 박싱/언박싱 덕분에 기본형처럼 쓸 수도 있다.1. DTO에서 Integer 를 사용하면?DTO에서 Integer를 사용하면 해당 DTO 객체 내부에 또 다른 Integer 객체가 존재하는 구조가 됨.public class SampleDTO { private Integer number; public SampleDTO(Integer number) { this.number = number; }..

Java 2025.02.09

객체지향에서 상속과 합성의 장단점

oop에서는 코드 재사용성과 확장성을 높이기 위해 상속(Inheritance)와 합성(Composition)을 사용한다.상속 사용을 지양하는 이유새는 날 수 있다. 하지만 타조와 같이 날지 못하는 명확한 예외가 존재한다. 날지 못하는 새는 다시 수영할 수 있는 새와 못하는 새로 또다른 예외로 분리된다.이런 예외는 상속 관계를 깊고 복잡하게 만든다.    => 코드의 가독성과 유지보수성이 낮아진다. (깊고 복잡한데 상위 하나 수정하면 하위에 모두 영향..) 이런 문제는 합성, 인터페이스, 위임(delegation)으로 해결할 수 있다.    - is-a 관계는 합성과 인터페이스의 has-a 관계로 대체될 수 있다.    - 다형성은 인터페이스를 사용해 달성될 수 있다.    - 코드 재사용은 합성과 위임으..

Java 2025.02.04

리플렉션

리플렉션은 실행 중인 자바 프로그램이 자체적으로 검사하고 자신의 구조와 동작을 수정할 수 있게 해주는 기능이다.  컴파일 타임:클래스들의 메타데이터(클래스 정보, 메서드, 필드 등)를 수집이 정보들이 클래스로더에 의해 로드됨런타임:프로그램 실행 중에 동적으로 클래스의 정보를 검사하고 조작 가능클래스 이름이나 메서드 이름으로 해당 객체나 메서드를 찾아서 사용 가능심지어 private 멤버에도 접근 가능1. 클래스의 정보 접근:Class clazz = Class.forName("com.example.MyClass"); 2. 필드 정보 접근 및 조작 Field[] fields = clazz.getDeclaredFields();Field field = clazz.getDeclaredField("fieldName..

Java 2025.01.12

업캐스팅 다운캐스팅

1. 기본 개념업캐스팅(Upcasting): 하위 클래스 객체를 상위 클래스 타입으로 변환. 자동으로 이루어지며, 상위 클래스의 멤버만 사용할 수 있음.다운캐스팅(Downcasting): 상위 클래스 타입의 참조를 하위 클래스 타입으로 변환. 명시적으로 캐스팅해야 하며, 하위 클래스의 고유 멤버를 사용하려는 경우 필요.2. 예상속 관계:class Parent { public String parentField = "Parent Field"; public void parentMethod() { System.out.println("Parent Method"); }}class Child extends Parent { public String childField = "Child ..

Java 2025.01.07

LSP

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

Java 2024.12.29

리스트처리(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