프로그래밍/JAVA Spring 37

[Spring 스프링] @Component, @Repository, @Service, @Controller 는 뭐가 다를까

프로그램을 짜면서 @Component를 달아보기도 하고, @Repository로 바꿔서 달아보기도 했다. 근데 둘 다 프로그램이 잘 돌아간다. 궁금해져서 차이점을 찾아봤다. 🐣 컴포넌트 스캐닝 @ComponentScan 어노테이션을 달고있는 어플리케이션이 위치하는 패키지 내에서 이루어진다. 컴포넌트 스캐닝을 통해 @Component 어노테이션이 달린 클래스들을 빈으로 만든다. 🐣 @Component 스프링에서는 @Component을 사용하여 빈을 선택하고 등록한다. 🐣 @Repository, @Service, @Controller 각각의 어노테이션을 까고 들어가보면 @Component라는 어노테이션을 달고 있음을 확인할 수 있다. @Component가 일반화된 어노테이션이라고 생각하면 된다. 대충 코드를..

[Spring 스프링] consumes와 produces의 차이

produces 컨트롤러가 생산해서 클라이언트에게 반환하는 메시지의 형식을 지정 요청 헤더에서 Accept 헤더와 produces가 일치해야 함 @GetMapping(path = "/users", produces = MediaType.APPLICATION_JSON_VALUE) 컨트롤러에서 위의 어노테이션을 달고 있는 메서드 왈: 내가 보내는 응답은 json 형식이란다^.^~ consumes 컨트롤러가 클라이언트로부터 받아서 소모하는 메시지의 형식을 지정 요청 헤더에서 Content-Type 헤더와 consumes가 일치해야 함 @PostMapping(path = "/users", consumes = MediaType.APPLICATION_JSON_VALUE) 컨트롤러에서 위의 어노테이션을 달고 있는 메서..

[JAVA 자바] chat gpt와 SOLID 원칙에 대해 공부를 해보았다(2)

👇chat gpt와 SOLID 원칙에 대해 공부를 해보았다 1편👇 [JAVA 자바] chat gpt와 SOLID 원칙에 대해 공부를 해보았다(1) 요즘 책을 읽으면서도, 강의를 들으면서도 가끔 SOLID 원칙이 언급되길래, 한번 chat gpt와 대화하며 공부한 내용을 정리해 보았다. 🤔 SOLID 원칙이란? 객체 지향 프로그래밍에서 유지보수와 확장을 finger-ineedyourhelp.tistory.com 지난 포스팅에 이어, 이번 포스팅에서는 인터페이스 분리 원칙(ISP)와 의존관계 역전원칙(DIP)를 다룬다. 🍏 I 인터페이스 분리 원칙 (ISP, Interface segregation principle) 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다. 즉, 인터페이스를 작게 분..

[JAVA 자바] chat gpt와 SOLID 원칙에 대해 공부를 해보았다(1)

요즘 책을 읽으면서도, 강의를 들으면서도 가끔 SOLID 원칙이 언급되길래, 한번 chat gpt와 대화하며 공부한 내용을 정리해 보았다. 🤔 SOLID 원칙이란? 객체 지향 프로그래밍에서 유지보수와 확장을 쉽게하고, 코드의 유연성 등을 보장하기 위해 만들어진 다섯가지 원칙이다. 이 원칙은 단일 책임 원칙(SRP), 개방-폐쇄 원칙(OCP), 리스코프 치환 원칙(LSP), 인터페이스 분리 원칙(ISP), 의존관계 역전 원칙(DIP)으로 구성된다. 🍏 S 단일 책임 원칙 (SRP, Single Responsibility Principle) 하나의 클래스나 모듈은 하나의 책임만 가져야 한다. SOLID 원칙을 정의한 로버트 마틴은 여기서 '책임'을 단순히 클래스나 모듈이 해야 할 일을 의미하는 것이 아니라,..

[JAVA 자바] 추상클래스의 올바른 사용 방법

오늘 체스 미션 코드리뷰에서 추상 클래스에 대한 피드백을 받아서, 이 내용에 대해 한번 스스로 정리해보고자 한다. 먼저 코드리뷰를 받은 문제의 코드를 보여주겠다. 체스에서 Queen, King, Rook, Pawn, Knight, Bishop이라는 기물들에 대한 클래스를 먼저 작성하였고, 코드를 작성하다보니 코드가 중복되는 부분이 많아서, 중복되는 부분은 모두 체스 기물을 추상화한 Piece라는 추상클래스에 올렸다. public abstract class Piece { protected final Team team; protected final Movement movement; public Piece(Team team, Movement movement) { this.team = team; this.mov..

[JAVA 자바/이펙티브 자바] 아이템 46. 스트림에서는 부작용 없는 함수를 사용하라

스트림에서는 부작용 없는 함수를 사용하라 🐣 부작용이 없다? - 오직 입력만이 결과에 영향을 줘야 한다. - 다른 가변 상태를 참조하지 않고, 함수 스스로도 다른 상태를 변경하지 않는다. 이것을 `순수 함수`라고 부른다. 다음 예시에선, 스트림의 forEach에서 외부의 results를 참조하고, results의 상태를 변경하게 되는 부작용이 발생한다. ArrayList results = new ArrayList(); stream.filter(s -> pattern.matcher(s).matches()) .forEach(s -> results.add(s)); 아래처럼 고치는게 좋다. Listresults = stream.filter(s -> pattern.matcher(s).matches()) .coll..

[JAVA 자바] 람다(lambda)

🐣 람다식 람다식(Lambda expression)은 간단히 말해서 메서드를 하나의 '식(expression)'으로 표현한 것이다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 사라지게 되는데, 그래서 람다식은 익명 함수라고도 한다. 람다식은 메서드의 매개변수로 전달되어지는 것이 가능하고, 메서드의 결과로 반환될 수도 있다. 즉, 람다식으로 인해 메서드를 변수처럼 다룰 수 있다는 뜻이다. 보통의 메서드와 달리 이름이 없으므로 익명이라 표현한다. 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 람다식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. 익명 클래스처럼 많은 자질구레한 코드를 구현할 필요가 없기 때문에 간결하다. 람다식은 파라미터, 화살표, 바디 세 부분으로 이루..

[JAVA 자바] 스트림(Stream)

🐣 스트림의 정의 스트림이란 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소 라 정의할 수 있다. 각 요소에 대해서 부연 설명을 하자면 다음과 같다. 1. 데이터 처리 연산 스트림은 filter, map, reduce, find, match 등의 연산으로 데이터를 조작할 수 있게 한다. 2. 소스 스트림 소스가 될 수 있는 대상으로는 배열, 컬렉션, 임의의 수 등 다양하다. 스트림은 이러한 데이터 제공 소스로부터 데이터를 소비한다. 3. 연속된 요소 데이터 소스는 연속된 요소를 스트림에 제공한다. 연속된의 의미는 순차적으로 값에 접근한다는 뜻이다. 🐣 스트림의 장점 1. 가독성 스트림은 기존의 for문과 if문을 조합해서 코드를 짜는 것보다, 더 간결하고 가독성이 좋다. 이는 스트림이 작업을 ..

[JAVA 자바] equals와 hashcode를 함께 정의해야 하는 이유

두 객체의 주소값이 같다면 두 객체를 물리적으로 같다고 한다. 두 객체가 주소값이 일치하지 않더라도, 두 객체의 필드가 일치하기만 한다면 두 객체가 같다고 판단하는 것은 두 객체는 논리적으로 같다고 한다. 모든 클래스들은 Object 클래스를 상속하는데, Object 클래스에는 equals 메소드가 존재한다. equals를 재정의 하지 않은 상태에서는 두 객체를 비교할 때 물리적 같을 때만 true를 반환한다. 반면 equals를 오버라이딩으로 재정의 해준다면 두 객체가 논리적으로 같을 때도 true를 반환하게 된다. 인텔리제이의 Generate 단축키(윈도우 기준 alt + insert)를 사용하면, 인텔리제이는 eqauls와 hashcode를 한번에 재정의하게 한다. 인텔리제이는 괜한 짓을 하지 않는..

[JAVA 자바] NumberFormatException은 IllegalArgumentException을 상속한다 / Exception 계층 구조

아주 큰 정수가 들어오는 경우에는 따로 예외처리하는 코드를 작성하지 않아서 이를 작성하고자 했다. 프로모션 코드를 작성하기에 앞서 테스트 코드를 작성하는 중이었는데 이상한걸 발견했다. 입력값으로 아주 큰 정수를 주었는데, IllegalArgumentException을 발생시켰다며 테스트 코드를 통과해버린 것이다. 나는 테스트가 실패할 줄 알았다. 실제로 프로그램을 실행시키고 아주 큰 정수를 입력값으로 주었을 땐 NumberFormatException이 발생했다고 하였기 때문이다. 그래서 IllegalArgumentException을 NumberFormatException으로 바꾸고 정보를 봤다. 그랬더니 IllegalArgumentException을 상속한다고 써있다. 다음 링크로 들어가보면 Except..

1 2 3 4