본문 바로가기
728x90
728x90

Study56

Eager Loading & Lazy Loading 아직 JPA랑 좀 서먹서먹한 관계라 이 친구에 대해 잘 알지 못 한다. Eager Loading 과 Lazy Loading에 대해 처음 들었을 때는 '그게 뭔데;;' 라는 생각이 들었고, 누군가가 설명해줬을 때는 '그런게 된다고?' 라는 생각이 들었다. JPA랑 조금 더 친해져 보자. Eager 일반적인 게시판을 생각했을 때, 게시글(Post)와 사용자(Member)의 관계는 N:1 이다. // Member Entity @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; ... } // Post Entity @Entity public c.. 2023. 7. 16.
도메인 객체의 equals & hashcode (feat. ID) 장바구니 협업 미션 을 진행하며 도메인객체에 ID 필드를 넣어주었다. public class Order { private final Long id; private final Integer price; private final Member member; private final CartItems orderedItems; //... } 도메인 객체가 ID를 갖고 있을 때의 장점과 단점을 비교해 보았을 때, 장점 쪽이 좀 더 마음에 와닿았기 때문이다. 도메인에 ID를 넣어주겠다는 것은 객체의 식별자로 ID를 사용하겠다는 의미이고, ID를 통해 동등성을 보장하겠다는 의미이다. 처음에는 굳이 동등성을 보장할 필요가 없는 도메인 객체는 equals & hashcode를 재정의해주지 않았다. 필요하지가 않은데 굳이 .. 2023. 6. 7.
@Transactional(readOnly = true) 이거 왜함..? 그냥 안쓰면 되는거 아님? @Transactional 다른 크루들은 이미 많이 사용해본 듯 하지만, 나는 이번 미션(지하철)을 하면서 처음으로 @Transactional 어노테이션을 사용해봤다. @Transactional 주석을 통해 트랜잭션의 범위를 지정하는 사용한다. 트랜잭션 데이터 베이스의 상태를 변환 시키는 프로그램의 단위작업. 무슨 말이냐 하면, @Transactional 어노테이션을 사용하면, Spring은 해당 메서드에 대한 트랜잭션 관리를 자동으로 처리한다. 메서드가 호출 될 때 트랜잭션이 시작되고, 메서드가 정상적으로 완료되면 트랜잭션이 커밋되며, 예외가 발생하는 트랜잭션은 롤백된다. 만약, @Transactional 어노테이션을 클래스레벨에서 사용한다면, 해당 클래스의 모든 메서드에 대해 트랜잭션 관리를 하게된다.. 2023. 5. 22.
JSON 필드 하나면 왜 Jackson 파업함? 이번 장바구니 미션 2단계 를 진행하면서, 도저히 이해할 수 없는 에러가 하나 생겼었는데 왜 이러한 에러가 생겼고, 어떻게 해결 했는지 기록을 남겨보려 한다. 예외 발생 user 별로 장바구니를 추가하는 기능을 만들다 발생한 에러였다. 다음은 CartController의 일부이다. @PostMapping public ResponseEntity addProductToCart( @AuthenticationPrincipal User user, @RequestBody CartCreateRequest cartCreateRequest ) { final Long cartId = cartService.addProduct(user, cartCreateRequest.getProductId()); return Respons.. 2023. 5. 9.
[Spring] 200 vs 204 vs 404 자동차 미션 2단계를 진행하면서, 전체 저장내용을 불러오는 기능을 구현해야 했다. 그런데, 만약 저장된 게임이 없다면 응답을 어떻게 줘야할까? NoContent vs Empty List status code 204(no content)의 존재를 어디선가 주어 들어서 알고는 있었다. 말그대로 응답할 콘텐트가 없다는 뜻이니, 이걸 사용하면 좋겠다란 생각이 들어서 해당 status코드를 이용하여 응답을 주었다. @GetMapping("/plays") public ResponseEntity getResults() { List allResults = gameService.getAllResults(); if (allResults.isEmpty()) { return ResponseEntity.noContent().b.. 2023. 4. 24.
[Spring] @Repository vs @Component 삽질로그 결론부터 얘기하자면 @Repository 와 @Component는 bender 마다 다른 DB관련 예외를 @Repository어노테이션을 사용하면, DataAccessException으로 전환해준다고 한다. 이하의 글은 @Repository의 예외전환을 직접 확인해보고픈 욕심을 가진 의심병말기환자의 삽질 글임. 오늘 Spring Core 강의 에서 Dao에 @Repository 를 사용하냐 @Component 를 사용하냐 얘기를 나누던 도중 어떤 크루가 Dao 에 붙어있던 @Repository를 @Component로 바꿨더니, 잘 되던게 안된다고 했다. 나도 궁금해져서 해보니까 난 잘되더라. 근데 얘네 무슨 차이가 있는 걸까. 공식문서 확인 가장 신뢰도 높은 확인방법이라 생각하고 공식문서를 확인해봤다. .. 2023. 4. 23.
[Spring] @ResponseBody 무쓸모 아님?(HttpMessageConverter, ResponseEntity) 이번에 웹 자동차경주 미션 1단계를 진행 하면서 프론트에서 보낸 요청에 대해 응답을 주기 위해, @ResponseBody 어노테이션을 method에 붙여주었다. @PostMapping("/plays") @ResponseBody public ResultDto play(@RequestBody GameInfoDto gameInfoDto) { ... } 그런데 페어인 이리내가 @ResponseBody 어노테이션을 제거하면 어떻게 되냐고 물어보길래, "글쎄... 해보쉴?" 하고 어노테이션을 제거하고 실행해봤다. 그런데 예상과 달리 어노테이션의 유무와 상관없이 똑같이 동작하더라. @ResponseBody는 사실 간지용이 아닐까..? @ResponseBody 간지용인지 아닌지 확인하기 위해 뭐하는 놈인지 확인을 해봤.. 2023. 4. 14.
뒤늦게 공부해보는 함수형 인터페이스, 근데 이거 왜 씀? 우테코 레벨1 체스미션을 진행하며 함수형 인터페이스를 처음 사용해봤다. 정말 뒤늦게 공부하는 거 같긴한데.. 늦게라도 하는게 안하는 것보다는 항상 낫다고 생각한다. 함수형 인터페이스란? 함수형 인터페이스는 1개의 추상 메소드를 갖고 있는 인터페이스를 말한다. 다른 말로 SAM(Single Abstract Metehod)이라고 불리기도 한다. public interface Example { void doSomething(String string); // public abstract 생략 } 위의 인터페이스는 하나의 추상 메서드를 가지고 있는 인터페이스이다. 즉, 함수형 인터페이스의 조건을 충족하고있다. 위처럼 정의된 함수형 인터페이스는 람다를 이용해 접근할 수 있다. Example func = (strin.. 2023. 3. 29.
VARCHAR(20)에는 한글로 몇 글자까지 입력가능할까? 레벨1의 하이라이트 체스미션을 진행하면서, DB에 게임룸마다 게임을 생성하고 저장하는 기능을 구현해야 했다. 각각의 게임룸에 이름을 정할수 있으면 좋을것 같아서 room에 대한 테이블을 아래와 같이 작성했다. CREATE TABLE `room` ( `_id` int PRIMARY KEY NOT NULL AUTO_INCREMENT, `roomName` varchar(10), `currentTurn` varchar(5) default 'WHITE' )ENGINE=InnoDB DEFAULT CHARSET=utf8; table에서 CHARSET을 utf-8로 설정하였기에, 한글은 3글자까지 밖에 안들어가겠지 하고이것저것 테이블에 값을 집어넣어 봤다. 근데 예상과는 달리 한글이 4글자도 들어가고 5글자도 들어간다.. 2023. 3. 27.
어질어질 LinkedHashMap 복사하기 레벨1 - 블랙잭 미션을 진행하며, LinkedHashMap을 이용하여 플레이어와 플레이어의 배팅 금액을 저장하였었다. private final Map bettingMap = new LinkedHashMap(); LinkedHashMap을 사용한 이유는 플레이어가 생성된 순서대로 베팅금액을 입력받고, 그 순서대로 출력되기를 원했기 때문이다. 출력을 위해 당당하게 getter를 사용했는데, Map을 그냥 던져주기엔 불안하다. Map.copyOf()를 통해 복사된 Map을 던져주고 코드를 돌려봤다. 그런데 출력된 결과는 입력된 순서와는 상관없이 무작위 하게 섞여있는 것을 확인할 수 있었다. 왜죠? CopyOf() 까보기 static Map copyOf(Map 2023. 3. 13.
넌 지금 전혀 util 하고 있지 않아. util이 util한가? 레벨1 사다리미션의 리뷰 중 이제껏 한번도 생각해보지 않았던 의문을 갖게 만든 리뷰가 있었다. 평소 아무 생각없이 utils 패키지를 만들고, 그 안에 Validator 클래스를 두어 검증로직을 관리했다. 사다리미션 역시 마찬가지의 방식으로 패키지를 구성했었다. 그리고 이에 대해 이번 리뷰어는 Validator 클래스가 정말 utils 패키지에 어울리는지에 대한 의문을 안겨줌과 동시에 utils 패키지의 역할에 대한 의문 또한 안겨주었다. 그냥 너무나도 흔하게 사용하고 자주 사용하다보니, util이란 패키지 또는 클래스에 대해 한번도 깊게 생각해본적이 없는 것 같다. 우테코는 나에게 정말 많은 의문들을 안겨준다. 해결은 내 몫이니 파고들어보자. 소프트웨어에서의 util util .. 2023. 3. 12.
LinkedList에서 삭제된 노드의 next의 null 처리 할까 말까? 학습을 위해 작성된 포스팅 입니다. 잘못된 내용이 있으면, 지적해주세요! Linked List 미니미션 우테코 레벨1 사다리 미션 진행 중, LinkedList를 직접 구현해보는 미니미션이 하나 추가되었다...ㅎ (와.. 신난다...) 자료구조에 대한 선수지식이 없어서 제법 애를 먹었는데, 아주 멋진 크루 마코 에게 이런저런 질문을 하며, 얼레벌레 구현을 하는데는 성공하였다. 그런데 구현을 하던도중 한가지 의문점이 떠올랐다. null 처리 해줘야 하나..? 의문이 든 시점은 remove 기능을 구현하는 도중이었다. LinkedList 의 remove 는 위의 그림과 같은 방식으로 구현되는데, 삭제된 노드(C)의 next는 여전히 D를 가리키고 있다. C의 next를 null로 처리를 해줘야 할까..? 참.. 2023. 2. 24.
우리 당당하게 getter 씁시다! 학습을 위해 작성된 포스팅 입니다. 잘못된 내용이 있으면, 지적해주세요! 객체지향을 공부하다 보면, 한번쯤은 맞닥뜨리는 문장이 있다. getter/setter/property를 쓰지 않는다. 객체지향 생활체조 9번에 해당하는 내용이다. 이제껏 위의 문장을 성서에 나온 문구처럼 가슴속에 깊이 새기고, 왜에 대한 의문은 품지 않았다. (무교임) 최근에 반란군크루에 가입하게 되었는데, 반란군답게 "왜 안되는데?" 마인드로 한번 다가가보자. setter에 관한건 이미 너무 멋진 글이 있으니 참고하면 좋을 듯 하다. getter 왜 안쓰냐? getter를 지양하자. 가 중론이기 때문에 당당하게 getter씁시다! 를 외치기 위해선 왜 getter를 쓰면 안되는지 를 먼저 샅샅이 파악하고, 그 빈틈을 노려야 한다... 2023. 2. 21.
[CS] DB - 트랜잭션과 무결성 트랜잭션은 하나의 논리적 기능을 수행하기 위한 작업의 단위를 뜻한다. 즉, 여러개의 쿼리를 하나로 묶는 단위를 말한다. 트랜잭션의 ACID 특성이란? 원자성(Atomicity) 트랜잭션 중간에 어더한 문제가 새기면 트랜잭션에 해당하는 어떠한 작업내용도 수행되어서는 안되고, 아무런 문제가 없을 경우에는 모든 작업이 수행되어야 한다. 일관성(Consistency) 트랜잭션이 완료된 다음의 상태에서도 트랜잭션이 일어나기 전의 상황과 동일하게 데이터의 일관성을 보장해야 한다. 고립성(Isolation) 각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야한다 지속성(Durability) 트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다. 무결성 무결성이란 데이터의 정확.. 2023. 2. 18.
[CS] DB - ERD와 정규화 ERD는 데이터 베이스를 구축할 때 가장 기초적인 뼈대 역할을 하며, 릴레이션간의 관계들을 정의한다. ERD의 중요성 시스템의 요구사항을 기반으로 작성되고, 이 ERD를 기반으로 데이터 베이스를 구축한다. DB 구축 이후에도 디버깅 또는 비즈니스 프로세스 재설계가 필요한 경우 설계도 역할을 하기도 한다. 관계형 데이터를 구성하는데는 유용하나, 비정형 데이터를 충분히 표현할 수 없다. 정규화 과정 정규화 과정은 릴레이션 간의 잘못된 종속관계로 인해 데이터베이스 이상현상이 일어나서 이를 해결하거나, 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러개로 분리하는 과정이다. 여기서 말하는 데이터 이상 현상이란, 회원이 한 개의 등급을 가져야 하는데 세개의 등급을 갖거나, 데이터 삽입 시, 하나의 필드값이 N.. 2023. 2. 18.
[CS] DB - 데이터베이스의 기본 데이터 베이스는 일정한 규칙또는 규약을 통해 구조화 되어 저장되는 데이터의 모음이다. 해당 데이터베이스를 제어, 관리하는 통합 시스템을 DBMS라고한다. DBMS마다 query를 통해 삽입, 삭제, 수정, 조회 등을 수행할 수 있다. 또한, 데이터베이스는 실시간 접근과 동시 공유가 가능하다. 엔터티 엔터티는 사람,장소, 물건, 사건, 개념 등 여러개의 속성을 지닌 명사를 의미한다. 물론 현실세계에 있는 모든 개념을 속성으로 만드는 것이 아니라, 추상화 과정을 통해, 서비스의 요구사항에 맞춰 속성이 정해진다. 속성 속성은 릴레이션에서 관리하는 구체적이고 고유한 이름을 갖는 정보이다. 약한엔터티 강한엔터티 A가 혼자서는 존재하지 못하고, B의 존재 여부에 따라 종속적이라면 A는 약한 엔터티이고, B는 강한 .. 2023. 2. 18.
[Spring] 자동 의존관계 주입 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성하였습니다. [Spring] 싱글톤 컨테이너 와 이어지는 포스팅입니다. 전체 소스코드 보기 다양한 의존관계 주입방법 의존 관계 주입의 방법은 크게 4가지가 있다. 생성자 주입 수정자 주입(setter) 필드 주입 일반 메서드 주입 생성자 주입 말그대로 생성자를 통해서 의존관계를 주입하는 방법이다. 이전의 포스팅에서 사용한 방법이 전부 생성자 주입이다. 특징으로는 생성자 호출 시점에 딱 한번만 호출되는것이 보장되고, 불변적이고 필수적인 의존관계에서 사용 된다는 점이다. 예제로 이전에 작성했던 OrderServiceImpl을 확인해보자. @Component public class OrderServiceImpl implements OrderService{ .. 2023. 2. 2.
[Spring] 컴포넌트 스캔 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성하였습니다. [Spring] 싱글톤 컨테이너 와 이어지는 포스팅입니다. 전체 소스코드 보기 컴포넌트 스캔과 의존관계 자동 주입 이전 포스팅까지 스프링 빈을 등록할 때는 AppConfig 파일에 @Bean을 통해서 설정정보에 직접 등록할 스프링 빈을 작성했다. 근데 이거 귀찮다. 매우. 지금은 아주 간단한 예제코드를 작성하는 거기 때문에 별거 없네 라고 생각할 수 있지만, 실무에서는 수십, 수백개의 스프링빈을 등록해야 될거다. 근데 이렇게 된다면 당연하게도 누락되는 일도 생길거고, 설정정보도 지나치게 방대해지고, 가장 중요한건 귀찮다.. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이란 기능을 제공한다. 또한, 의존 관.. 2023. 2. 1.
[CS] OS - 메모리 메모리 계층 메모리계층은 레지스터, 캐시, 메모리, 저장장치로 구성되어 있다. 각각의 특징은 다음과 같다. 레지스터 : CPU안의 작은 메모리, 휘발성, 속도 가장 빠름, 용량 가장 적음 캐시 : L1, L2 캐시를 지칭한다. 휘발성, 속도 빠름, 용량 적음 주기억장치 : RAM을 가리킨다. 휘발성, 속도 보통, 용량 보통 보조기억장치 : HDD, SSD를 일컬으며, 비휘발성, 속도 낮음, 용량 큼 계층의 위로올라갈수록 가격은 비싸지고, 속도는 빨라지고, 용량은 적어지는 특징을 갖고 있다. 이러한 계층이 존재하는 이유는 경제성과 캐시 때문이다. 캐시 캐시는 데이터를 미리 복사해 놓는 임시 저장소이다. 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리를 말한다. 예로, 메모리와 .. 2023. 1. 31.
[Spring] 싱글톤 컨테이너 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성하였습니다. [Spring] 스프링 컨테이너와 이어지는 포스팅입니다. 전체 소스코드 보기 웹애플리케이션과 싱글톤 웹 애플리케이션은 보통 여러고객이 동시에 요청을 한다. 만약 3명의 고객이 회원가입을 한다면, 각각의 요청마다 새로운 memberService 가 생겨날 것이다. 테스트 코드를 통해 확인해보자. public class SingletonTest { @Test @DisplayName("여러개의 멤버 서비스 생성 확인") void memberServiceTest() { AppConfig appConfig = new AppConfig(); MemberService memberService1 = appConfig.memberService(); Mem.. 2023. 1. 31.
728x90
728x90