분류 전체보기
-
[Effective Java] 아이템15: 클래스와 멤버의 접근 권한을 최소화하라Language/Java 2022. 6. 22. 11:57
잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다. 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않는다. 이러한 정보 은닉 혹은 캡슐화라고 하는 개념은 소프트웨어 설계의 근간이 되는 원리다. ✔️ 정보 은닉의 장점 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다. 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 부담도 적기 때문이다. 정보 은닉 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움을 준다. 완성된 시스템을 프로파일링해 최적화할 컴포넌트를 정한 다음, 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최적화할 수 있기 때문이다...
-
[Effective Java] 아이템14:Comparable을 구현할지 고려하라Language/Java 2022. 6. 20. 13:20
이번에는 Comparable 인터페이스의 유일한 메서드인 compareTo에 대하여 알아보자. compareTo 는 두 가지만 빼면 Object의 equals와 같다. 첫 번째, compareTo 는 단순 동치성 비교에 더해 순서까지 비교할 수 있다. 두 번째, compareTo 는 제네릭하다. Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연저인 순서(natural order)가 있음을 뜻한다. 그래서 Comparable을 구현한 객체들의 배열은 손쉽게 정렬할 수 있다. Arrays.sort(a); 또한, 검색, 극단값 계산, 자동 정렬되는 컬렉션 관리도 쉽게 할 수 있다. String이 Comparable을 구현하였기 때문에 다음 예제는 명령줄 인수들을 (중복 제거하고) 알파벳순으..
-
[Effective Java] 아이템13: clone 재정의는 주의해서 진행하라Language/Java 2022. 6. 16. 00:37
Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 '믹스인 인터페이스(mixin interface, 아이템 20)'지만, 의도한 목적을 제대로 이루지 못했다. 가장 큰 문제는 clone 메서드가 선언된 곳이 Cloneable이 아닌 Object이고, 그 마저도 protected라는 것이다. 그래서 Cloneable을 구현하는 것만으로는 외부 객체에서 clone 메서드를 호출할 수 없다. 이러한 여러 문제점에도 불구하고 Cloneable 방식은 널리 쓰이고 있어 잘 알아두는 것이 좋다. 이번 아이템에서는 clone 메서드를 잘 동작하게끔 해주는 구현 방법과 언제 그렇게 해야 하는지, 그리고 가능한 다른 선택지에 관해 논의할 것이다. ✔️ Cloneable 인터페이스 먼저 메서드 하나 없는 Clo..
-
[따라하며 배우는 도커와 CI환경] 7. 간단한 어플을 실제로 배포해보기(테스트 & 배포 부분)DevOps/Docker 2022. 6. 13. 16:09
이번에는 지난 포스트에서 생성한 애플리케이션을 배포해보자! 다음의 순서대로 애플리케이션을 테스트 및 배포할 것이다. Github에 소스 코드 업로드 Travis CI 연동 AWS Elastic Beanstalk 환경 구성 배포 ✔️ Github에 소스 코드 업로드 먼저 Github에 애플리케이션의 소스 코드를 올려야 한다. 1️⃣ Repository 생성 깃허브에서 새로운 repository를 생성한다. 나는 docker-react-app 이라는 이름으로 repository를 생성하였다. 강의에서는 public은 무료, private 유료라고 했다. 그러나 나는 private으로 설정해도 별도의 요금은 부과되지 않았다. 2️⃣ 로컬 git 저장소 만들기 $ npm init 우리는 처음에 npx creat..
-
[Effective Java] 아이템12: toString을 항상 재정의하라Language/Java 2022. 6. 10. 21:56
Object의 기본 toString 메서드가 작성한 클래스의 적합한 문자열을 반환하는 경우는 거의 없다. 이 메서드는 단순히 클래스_이름@16진수로_표시한_해시코드 를 반환할 뿐이다. toString의 일반 규약에 따르면 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환해야 한다. 또한, toString의 규약은 '모든 하위 클래스에서 이 메서드를 재정의하라'고 한다. equals와 hashCode 규약만큼 대단히 중요하진 않지만, toString 을 잘 구현한 클래스는 사용하기 훨씬 즐겁고, 디버깅하기 쉽다. 그렇다면 이제부터 toString을 재정의할 때 유의할 점을 알아보자. ✔️ 실전에서 toString은 그 객체가 가진 주요 정보 모두를 반환하는 게 좋다. 만약 객체가 거대하거나, 객체..
-
9. 값 타입 (2)Back-End/JPA 2022. 6. 10. 14:06
5. 값 타입 컬렉션 (Collection Value Type) 값 타입을 하나 이상 저장하려면 컬렉션에 저장하면 된다. 이때 2가지 어노테이션이 필요하다. @ElementCollection: 값 타입 컬렉션을 사용하는 속성에 표시한다. @CollectionTable: 컬렉션을 위한 추가 테이블을 매핑한다. 생략 가능하며, 기본값으로 {엔티티 이름}_{컬렉션 속성 이름} 테이블과 매핑한다. 위의 다이어그램에서 favoriteFoods는 기본값 타입 컬렉션이고, addressHistory는 임베디드 타입 컬렉션이다. 관계형 데이터베이스 테이블의 컬럼 안에 컬렉션을 포함할 수 없기 때문에, 두 가지 값 타입 컬렉션 모두 별도의 테이블을 추가하고, 추가한 테이블을 매핑해야 한다. favoriteFoods 와 ..
-
9. 값 타입 (1)Back-End/JPA 2022. 6. 9. 12:05
JPA의 데이터 타입을 크게 분류하면 엔티티 타입과 값 타입으로 나눌 수 있다. 엔티티 타입은 @Entity로 정의하는 객체이고, 값 타입은 int, Integer, String 처럼 단순한 값으로 사용하는 자바 기본 타입이나 객체를 말한다. 값 타입은 기본값 타입(basic value type), 임베디드 타입(embedded type), 컬렉션 값 타입(collection value type) 3가지로 나눌 수 있다. 값 타입은 식별자가 없고 추적할 수 없는 정보라고 볼 수 있다. 지금부터 값 타입에 대하여 알아보자. 1. 기본값 타입 (Basic Value Type) 예제 코드) @Entity public class Member { @Id @GeneratedValue private Long id; ..
-
8. 프록시와 연관관계 관리Back-End/JPA 2022. 6. 7. 11:01
1. 프록시 엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아니다. 사용하지 않는 연관된 엔티티까지 데이터베이스에서 함께 조회해두는 것이 효율적이지 않다. JPA는 이런 문제를 해결하기 위해, 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법인 지연 로딩을 제공한다.지연 로딩 기능을 사용하려면 실제 엔티티 객체 데신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요하고, 이것을 프록시 객체라 한다. 📌 참고! JPA의 지연 로딩 JPA 표준 명세는 지연 로딩의 구현 방법을 JPA 구현체에 위임했다. 이후의 내용은 하이버네이트 구현체에 대한 내용이다. 1.1. 프록시 기초 JPA에서 식별자로 엔티티 하나를 조회할 때는 EntityManager.find() 를 사용한다. 이 메소..