본문 바로가기

DevelopmentTools33

[Java] 객체 지향 설계 5원칙 - SOLID 원칙 JAVA를 사용한다면 객체지향에 대해서 한 번 쯤은 들어봤을 것이다. (ex. OOP 4대 특징 : 추상화, 상속, 캡슐화, 다형성)이러한 객체지향의 특징을 더 잘 사용하기 위해서 객체지향 설계(OOD) 원칙이 존재한다.그 중 5대 원칙을 나열하여 SOLID 원칙이라고 불리게 되었고 아래에서 이 5가지 원칙을 자세하게 알아보도록 하자.SOLID 원칙은 소프트웨어 설계에 있어 이해하기 쉽고 유연하며, 유지보수 및 확장이 편하다는 장점을 가지게 해준다.1. S (SRP)SRP (Single Reponsibility Principle) : 단일 책임 원칙하나의 클래스 및 메소드는 하나의 책임만 가져야 한다. 수정되어야 하는 이유 및 시기가 다르다면 그 클래스는 단일 책임 원칙이 적용되지 않은 .. 2024. 4. 19.
[Java] Java의 static 키워드는 상속이 불가능한 이유와 Hiding '켄트벡의 구현 패턴' 책을 다시 정독하던 날이었다.. 10장의 내용인 프레임워크 개발 패턴 읽다가 의문이 들어 작성하게 되었다 부모클래스의 static 메소드를 자식클래스에서 오버라이딩(Overriding)하지 못한다는 내용이었다. 즉, 정적 메소드는 오버라이딩 할 수 없다. 이 내용이 왜 그런지에 대한 개념이 제대로 잡혀있지 않는 것 같아 정리하고자 글을 작성한다 Dynamic Method Dispatch = 다이나믹 메소드 디스패치 메소드 디스패치: 어떤 메소드를 실행시킬지 결정하고 실행시키는 과정 Dynamic하므로 컴파일러가 어떤 메소드를 실행시킬지 모르기 때문에 런타임 과정에서 호출할 메소드를 선택하는 것이다. c.f) Static 메소드 디스패치도 있는데 가장 큰 예시론 자바의 main함수가.. 2024. 3. 28.
[Java] 객체지향 생활 체조 원칙 9가지 1. 한 메서드에 오직 한 단계의 들여쓰기만 한다. = 메서드의 깊이는 최대 1 즉, 맡은 일을 작게 가져가라. 깊이가 깊다면 그만큼 맡은 일이 많다(책임이 많다)는 의미이다. 이는 객체지향적이지 못하다는 의미와 같다. 2. else 키워드를 쓰지 않는다. -> 핵심은 `early return` 동시에 1번 규칙인 "깊이 제한은 1"까지 동시에 지키게 된다 문제코드를 한 번 보자 public class JamieObject { String JamieStatus(int hour, boolean isStudy) { String status = ""; if (hour > 4 && hour 4 && hour 정답은 "ㄴㄴ 마찬가지로 문제있음"이다. `early reeturn`의 목적은 "분기를 태우지 않는다"인.. 2024. 3. 9.
Object Mother 패턴이란? 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. Object Mother패턴이란? 한 줄로 표현하면 “test Object를 만들어 주는 Class”이다. 테스트 데이터를 작성할 때 많은 예제 데이터가 필요한데 테스트 시점마다 새로운 데이터를 만드는 것이 비효율적인 task라고 생각이 들었고 이를 해결하기 위해 착안된 패턴이 “Object Mother 패턴"이다. 여러 테스트 클래스에서 유사한 데이터가 필요한 경우가 많아 테스트 시점에 standard fixtures를 만들 수 있는 factory object를 만드는 것이다. 장점 단점 재사용성이 증가한다 여러 테스트에 유사한 데이터를 사용하면 사용자들이 테스트 코드에 친숙해질 수 있다.. 2023. 12. 13.
[JPA] deleteAll과 deleteAllInBatch의 차이 UserController.java @DeleteMapping("/carts") @ResponseStatus(NO_CONTENT) public KurlyResponse removeProduct( @AuthenticationPrincipal User user, @RequestBody RemoveCart.Request removeProductList ) { userService.removeProductList(removeProductList, user.getId()); return KurlyResponse.noData(); } UserService.java @Transactional public void removeProductList(RemoveCart.Request removeProductList, Lo.. 2023. 10. 19.
[JPA] JPA가 기본 생성자가 필요한 이유 (feat. final) 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. 1️⃣ JPA에서 기본 생성자를 필요로 하는 이유 JPA에서 Entity는 반드시 public 또는 protected인 기본 생성자를 가져야 한다 이것이 가능한 이유는 JPA가 자바에서 제공하는 리플렉션 API를 활용하여 동적으로 객체를 생성하기 때문이다 만약, 기본 생성자가 없거나 private인 경우 리플렉션 API는 객체를 생성할 수 없게된다. 리플렉션 API란 구체적인 클래스 타입을 몰라도 클래스 이름으로 메서드, 타입, 변수등 클래스의 모든 정보에 접근할 수 있도록 해주는 API이다. 리플렉션을 활용하여 런타임 시점에 동적으로 클래스 객체를 생성할 수 있는데 이때 객체를 생성하기 .. 2023. 10. 12.
[JPA] CASCADE.ALL로 인한 버그 발생 및 해결법 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. 문제 상황 상품에 대한 review를 작성하는 api 기능 테스트를 진행하던 와중이었다. (/products/review, 사진의 서비스 메서드 호출) 아래와 같은 에러가 발생하였고 이를 해결했던 과정을 기록하고자 한다. 2023-09-21T17:55:12.524+09:00 WARN 81332 --- [nio-8080-exec-7] c.d.k.g.e.GlobalExceptionHandler : UnexpectedException Occurs : detached entity passed to persist: com.devcourse.kurlymurly.module.user.domain.Use.. 2023. 9. 25.
[JPA] N+1 문제 해결을 위한 Fetch Join 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. 🩶 N+1 문제란? 최대한 연관관계가 없이 Long타입으로 id만 받아서 프로젝트를 진행하던 와중..! 결국 review와 product, user의 연관 관계가 필요한 상황이 발생하게 되었다. 그래서 N:1 연관 관계를 맺었는데..! 연관 관계를 맺는 동시에 N+1문제가 발생하였다 N+1문제란, 1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 것이다. 원치않는 쿼리가 실행된다면 시스템의 성능이 저하될 수 있다. Q. Lazy(지연로딩)옵션을 걸어줘서 괜찮은 거 아닌가요? A. 하위 엔티티로 작업을 하게 되면 추가적인 조회가 어차피 발생하기 때문에 결국 N+1문제가.. 2023. 9. 21.
[jpa] hibernate 자동 생성되는 sql 확인하기 jpa: properties: hibernate: show_sql: true format_sql: true show_sql: hibernate가 만들어내는 sql문을 출력 format_ sql: 출력되는 sql문을 예쁘게 출력하기 위한 속성 초기 데이터로 스키마 적용하는 방법 sql: init: mode: always # always, never, embedded sql-init-mode: 을 설정해주면 각각 root class path 위치의 schema.sql 과 data.sql에서 SQL을 로드한다. default로 SQL database initialization은 embedded in-memory database를 사용할 때만 수행된다. 유형에 관계 없이 SQL database를 항상 초기화하려.. 2023. 9. 4.