본문 바로가기

Be52

[토비의 스프링] 테스트 (2장) 2.1 UserDaoTest 다시 보기 2.1.1 테스트의 유용성 UserDao에서 관심을 분리하고 기능을 확장할 때 테스트가 없었다면 불안했을 것이다. 머릿속으로 시뮬레이션을 돌려보는 방법은 100% 확신할 수 없기 때문에 테스트란 내가 예상하고 의도했던 대로 코드가 정확히 동작하는지 확신할 수 있게 해주는 작업이 필요하다. 2.1.2 UserDaoTest의 특징 웹을 통한 DAO 테스트 방법의 문제점 웹 화면을 통한 테스트는 가장 흔히 쓰이는 방법이지만 단점이 너무 많다. 테스트를 위해 사용되는 자원이 많기 때문에 DAO만 테스트하고 싶은데 다른 곳에서 문제가 발생할 수 있다. 작은 단위의 테스트 테스트 수행 과정을 간단히 하고 오류를 쉽게 찾을 수 있게 하기 위해서 작은 단위로 쪼개는 것이 중요하다.. 2023. 1. 16.
[이펙티브 자바] 아이템 6 : 불필요한 객체 생성을 피하라 🎯 학습 목표 Why?? String Constant Pool Wrapper 클래스 📌 불필요한 객체 생성 피하기 불필요한 객체 생성에 대한 이야기는 아이템 1에서 잠깐이나마 엿볼 수 있었다. 인스턴스를 캐싱해 두면 불필요한 객체 생성을 피할 수 있다고 했다. 🤔 왜 피해야 할까? Java를 조금이라도 공부했다면 GC(Gabage Collection)의 존재를 알 것이다. 메모리를 하나하나 관리해야하는 C언어와 다르게 이 GC가 알아서 메모리의 누수를 방지해 주기 때문이다. 하지만 GC이 아무리 좋아져도 무분별한 객체 생성은 성능을 저하시킨다. 즉, 성능 때문에 피해야한다. 👀 언제 그럴까? 책에서 제시하는 예시와 함께 언제 불필요한 객체가 생성되는지 알아보자. 1️⃣ String String s = n.. 2023. 1. 15.
[Java] Reflection 🎇 Java Java를 사용하다 보면 리플렉션(Reflection)이라는 용어를 자주 접한다. 대충 무엇인지는 알겠는데 설명해 주세요! 하면 못 할 것 같아서 정리해 본다😋😋 🪞 리플렉션, Reflection 리플렉션이란? 단어의 의미를 떠올려서, 거울에 반사된 어떤 대상을 제약 없이 사용하는 기술이다. 자세하게 설명하면, 힙 영역에 로드된 Class 타입의 객체를 통해서 인스턴스를 생성하고, 접근 지정자의 제약 없이 인스턴스의 메소드와 필드를 사용할 수 있게 하는 Java API이다. 😮 힙 영역에서 Class 타입 가져오기 힙 영역에 로드된 Class 타입은 다음 3가지 방법으로 가져올 수 있다. 클래스.class 인스턴스.getClass() Class.forName(클래스명) public class.. 2023. 1. 11.
[이펙티브 자바] 아이템 3 : private 생성자나 열거 타입으로 싱글턴임을 보증하라 ✍️ 학습 목표 싱글턴 이해하기 싱글턴 vs 정적 클래스 📌 싱글턴 이해하기 싱글턴이란, 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 🛠️ 싱글턴 만들기 1️⃣ private static final 필드 방식 class Pokemon { public static final Pokemon INSTANCE = new Pokemon(); private Pokemon() { } } 싱글턴임을 확실하게 알 수 있고 간결하다. 하지만 리플랙션 API를 사용해서 private 생성자에 접근하면 제 2의 인스턴스가 만들어질 수도 있다. 추가적인 인스턴스가 생성되려고 할 때 예외를 던지는 방식으로 이런 공격을 방어할 수 있다. 2️⃣ 정적 팩토리 메서드 방식 class Pokemon { private sta.. 2022. 12. 21.
[이펙티브 자바] 아이템 2 : 생성자에 매개변수가 많다면 빌더를 고려하라 ✍️ 학습 목표 객체 생성하기 (feat. 생성자) 각각의 장단점 이해하기 📌 객체 생성하기 (feat. 생성자) 생성자를 사용해서 객체를 사용하는 방법은 3가지가 존재한다. 각 방식의 사용법들은 다음과 같다. 1️⃣ 점층적 생성자 매개변수가 다른 생성자를 여러 개 구현하는 방식이다. 필수 매개변수가 들어가는 생성자부터 선택 매개변수를 하나하나 추가되는 생성자를 점층적으로 구현하는 방식이다. class Pokemon { private final int attack, defense, hp; public Pokemon(int attack) { this(attack, 0, 0); } public Pokemon(int attack, int defense) { this(attack, defense, 0); } p.. 2022. 12. 21.
TIL : Random VS SecureRandom (19) 🛠️ Random과 SecureRandom 난수 생성을 위해서 보통 Random을 사용하는데, SecureRandom을 권장하더라! 왜 그럴까? 🤔 Random 우선 Random은 난수를 만들기 위해 사용하는데, 정말 무작위 숫자를 만들지 않고 의사 난수를 생성한다. 의사 난수란? 무작위의 숫자처럼 보이는 규칙적으로 만들어진 숫자이다. Random을 조금 써본 사람이라면 같은 seed라면 같은 값이 나오는 것을 알고 있을 것이다! 이게 바로 의사 난수라서 그렇다. 😮 SecureRandom 이름에서부터 느껴지듯이 보안성이 더 좋을 것만 같다. 그렇다면 정확하게 어떤 점이 다를까? 1️⃣ 크기 Random은 48 비트까지 지원하지만 SecureRandom은 128 비트까지 지원한다! 같은 값이 나올 확률이.. 2022. 12. 20.