본문 바로가기

728x90

JAVA

(16)
JPA에서 Entity에 protected 생성자를 만드는 이유. 엔티티에서 setter를 쓰는 것보다 생성자를 통해 파라미터를 넘기는 게 좋다. Setter를 무분별하게 남용하다 보면 여기저기서 객체(엔티티)의 값을 변경할 수 있으므로 객체의 일관성을 보장할 수 없기 때문. 그리고 setter는 그 의도를 알기 힘들기에 setter 사용을 자제해야한다. 그러므로 protect 생성자를 생성해서 아무데나 생성되는 걸 막는 게 좋다. (다른 사람이 쓰지 못하도록 제약한다.) 예시) Address address = new Address(); address.setLocation("광안리"); address.setCity("서울"); 그러나 JPA 표준 스펙에 디폴트 생성자가 있어야하기에 private 생성자를 사용할 수 없다. 왜냐하면 jpa가 프록시 기술을 쓰는데 거기서 ..
int, long 타입과 같은 Primitive type null 값이 안 들어가는 이유 1. 이유 int, long 타입 변수는 기본형(Primitive type) 변수입니다. 기본형 변수는 null 값이 없습니다. 실제 값을 저장 장소를 가져서, 값이 없으면 0을 반환합니다. 기본형 변수는 값이 없으면 아래의 값처럼 나오지만, null은 나오지 않습니다. Data Type Default Value (for fields) Java의 기본 요소에 대한 기본값 byte 0 short 0 int 0 long 0L float 0.0f double 0.0d char '\u0000' boolean false 2. 대처 방안 기본 데이터 유형은 null 일 수 없습니다. Object 데이터 유형 만 null 일 수 있습니다. 그래서 정수(int)가 null이 될 수 있도록 할려면 Integer, lon..
JPA의 성능은 과연 괜찮을까? (칼럼 한 개 vs 객체 칼럼) JPA에서 select 성능 차이 보통 컬럼을 하나하나 찍는 것이 데이터 전송량이 줄어들기 때문에 성능상 더 유리합니다. 다만 이렇게 원하는 컬럼만 찍어서 조회하게 되면 재사용성이 떨어집니다. 예를 들어서 회원 엔티티가 있는데 name, age, tel 필드가 있습니다. A로직에서는 회원의 name, 데이터가 필요하고, B로직에서는 회원의 name, age 데이터가 필요하고, C로직에서는 회원의 name, age, tel이 모두 필요하다고 가정하겠습니다. 성능을 완벽하게 최적화하려면 select 쿼리를 3개 각각 만들어야 합니다. 대신에 회원 엔티티를 직접 조회하는(name, age, tel을 모두 조회하는) 쿼리는 하나만 있으면 됩니다. 결국 성능과 범용성의 트레이드 오프(양립할 수 없는)가 발생합니다..
스프링부트 어노테이션 정리 @RestController 메소드의 반환 결과를 JSON 형태로 반환한다. @Controller -api와 view를 동시에 사용하는 경우에 사용. View return이 주 목적. @RequestMapping 요청 url을 어떤 메서드가 처리할 것인지 매핑해주는 어노테이션. 라우팅정보를 제공하며 선언한 경로의 값에 따라 HTTP 요청이 해당 메서드에 매핑되어야 하는 것을 스프링에 알림. @PutMapping 수정할 때 사용. @Bean:객체를 의미. Spring container에 bean을 등록하도록 하는 어노테이션. @bean: 개발자가 직접 제어 불가능한 외부 라이브러리등을 만들 때 사용. @component: 개발자가 직접 작성한 class를 bean으로 등록하기 위해 사용 @GetMappin..
JAVA - 리스트와 ArrayList 차이점, 메소드 설명. 1. List 리스트는 배열의 한계 때문에 만들어진 자료형. 프로그래밍 중 크기를 알 수 없는 경우가 더 많다. List는 메모리가 허용하는 한 '계속해서 추가'할 수 있도록 만든 자료형 인터페이스이다. (1) 추가 List listA = new ArrayList(); listA.add("김삿갓"); listA.add("홍아리"); listA.add(new String("홍길동")); listA.add(1,"1번째 요소값"); => 인덱스 1에 1번째 요소값이 들어가고 !데이터들이 하나씩 밀리게 된다.! (2) 조회 하나씩 값을 조회하고 싶으면 get(index); 데이터를 전부 출력하고 싶다면 Iterator와 for문 사용. String element0 = listA.get(0).toString();..
mkdirs와 mkdir 차이점 mkdirs 한 번에 여러 개의 폴더를 만듦. 반면 mkdir 한 번에 한 개의 폴더만 만듦.
JAVA 해쉬맵 - HashMap 1. 정의 key값을 기반으로 Value를 찾는 자료구조. 해시 함수를 통해 'key'와 'value'이 저장되는 위치를 결정하므로, 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 들어 있는 위치 또한 관계가 없다. 참고로 value는 값이 고유하지 않아도 되기에 얼마든지 중복되어도 상관이 없다. 2. 선언 HashMap contacts = new HashMap(); 3. 기본 메소드 1) 값을 넣고 싶을 때는 put 명령어. ex) contacts.put("key 값", "value 값"); 2) key 값으로, 값을 얻고 싶을 때는 get 명령어. ex) contacts.get("key 값"); 4. 기타 메소드 size() : 저장된 키의 총 갯수 출력 containsKey(K) : 해당 키가 ..
JPA(1) - 도메인 설계 1. 관계 일대일, 일대다, 다대일 관계를 많이 사용한다. 그러나, 실무에서는 다대다 관계를 쓰면 안된다. => 다대다 관계면 중간 엔티티(매핑 테이블)를 만들고 일 대 다( 1:*), 다 대 일(*:1) 로 매핑하여 표현해야 한다. Why? 다대다는 실무에 한계가 있다. 예를 들어 회원이 상품을 주문하면 연결 테이블에 회원 아이디와 상품 아이디만 담고 끝나지 않는다. 보통 주문 수량 칼럼이나 주문한 날짜 같은 칼럼이 더 필요하다. 이런 칼럼을 추가하면 더는 다대다(ManyToMany)를 사용할 수 없다. 왜냐하면 주문 엔티티나 상품 엔티티에 추가한 컬럼들을 매핑할 수 없기 때문이다. 즉, 중간 테이블에 값을 넣을 수 없기에, 결국 다대다를 일대다, 다대일 관계로 풀어야 한다. 2. 연관관계 가급적 양방..

728x90