일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 미국유학
- JVM아키텍처
- 자바 스터디
- 미국대학
- F1학생비자
- 유학생대학생활
- 미국대학생활
- 2+2
- 만다라트프로젝트
- 개발일지
- 사이드프로젝트
- 자바
- 복수학위제도
- 케네스
- 미국유학생활
- Kenneth Park
- i-20
- java
- CSUS
- California State University Sacramento
- Java 스터디
- 유학생 준비물
- 개인 프로젝트 개발일지
- 해외유학
- 파이데이아창의인재학과
- 비전공자 git
- 케네스로그
- jpa
- 부산외대
- 미국유학생
- Today
- Total
목록케네스로그 (12)
케네스로그
JPA N+1, 불필요한 쿼리를 줄여보자 이전 포스팅에서 트랜잭션을 고려한 리팩토링을 통해 불필요한 쿼리를 줄이는 작업을 진행했다. 모든 controller - service layer에서 예제 코드처럼 작성되었던 것은 아니었지만 몇몇 케이스가 존재했기에 개선작업을 수행했다. 그럼 이제 모두 끝난 것인가?🤔 어림도 없다. 개선작업에는 끝이없다. 이번에 풀어볼 N+1문제 이외에도 캐싱을 사용한다거나 아키텍쳐 레벨에서도 개선이 진행가능할 것으로 보인다. 차차 해결하는 것으로 하고, 이번 포스팅에서는 엔티티 간의 관계에 따른 추가 쿼리가 발생하는 N+1이슈를 분석하고 개선하도록 하자. 프로젝트의 엔티티 관계 우리 팀에서 기획/개발했던 프로젝트는 간단한 형식의 회원제 게시판이다. 이 글에서는 기술적으로 분석하고..
문제 중복되지 않는 정수로 이루어진 정렬된 배열 nums에 새로운 정수 target을 삽입하고자 한다. 정렬된 상태를 유지하면서 target이 삽입될 수 있는 index를 구하라. 만약, 배열 내에 target과 같은 값이 있다면 해당 index를 삽입 위치로 한다. 테스트케이스 nums = {1, 3, 5, 6} target = 5 output: 2 nums = {1, 3, 5, 6} target = 2 output: 1 nums = {1, 3, 5, 6} target = 7 output: 4 해설 및 풀이 주어진 배열의 처음과 끝, 이를 기반으로 중앙값을 정한다. 중앙값이 target보다 크다면 시작~중앙을 탐색한다 중앙값이 target보다 작다면 중앙~끝을 탐색한다. 자바 구현코드 class Sol..
스프링이란? 스프링(spring)은 보통 스프링 프레임워크를 뜻하며, 이 프레임워크는 아래의 특징을 지닌다. Dependency Injection Aspect-Oriented Programming MVC 웹 프레임워크 JDBC, JPA연동, 선언적 트랜잭션 처리 등 DB 연동 지원 핵심 기능들은 위와 같으나 스케쥴링, 메시지 연동, 이메일 발송, 테스트 등과 같은 추가 기능 또한 존재한다. 실제로 스프링 프레임워크 뿐 만 아니라 스프링 데이터, 스프링 시큐리티, 스프링 배치, 스프링 인티그레이션, 스프링 하둡 등 다양한 프레임워크들이 존재하며, 스프링과 함께 사용된다. 프로젝트 구성 도구 스프링 프레임워크에는 다양한 모듈이 존재하며, 핵심 모듈을 포함하여 경우에 따라 추가적으로 모듈을 설치해서 사용해야 ..
인터페이스 정의 인터페이스는 구현체에 대한 기능을 보증(약속)하기 위한 장치라고 할 수 있다. 인터페이스를 구현하는 클래스는 여러개의 인터페이스를 함께 구현할 수 있으며, 구현하기 위해 implements 키워드를 사용한다. 이는 abstract class를 구현하기위해 상속(extends)받는 것과 유사하다. 인터페이스는 body부분이 생략된 추상화 클래스의 집합이다. 따라서, 오직 메소드의 시그니처와 필드만 지닌다. 메소드는 정의되지 않는다 정적 변수처럼 필드를 정의하고 접근할 수 있다. interface Computer { public void playGame(String gameName); public void searchGoogle(String keyword); } interface Phone ..
package 키워드 package는 관련된 클래스들을 그룹화하기 위해 사용되며, 디렉토리의 폴더와 유사하다. package는 두가지의 종류로 나누어진다. build-in package user-defined package 빌트인 패키지 build-in package 자바 개발환경에서 Java API는 미리 만들어진 클래스들로 이루어진 라이브러리이다. 이 라이브러리는 패키지와 클래스로 나뉘어지는데, 개발자는 import할때 클래스 하나만 import 할 수도 있지만, 해당 클래스가 속한 package전체를 import 할 수도 있다. import java.util.ArrayList; // ArrayList class 하나만 import import java.util.*; // ArrayList가 속해있는..
메소드 디스패치 참조 https://blog.naver.com/swoh1227/222181505425 메소드 디스패치는 런타임에 어떤 메소드를 사용할것인지 정해지는 방법을 말합니다. 정적 메소드 디스패치 static method dispatch public class Vehicle{ public void move() { System.out.println("이동중"); } } public class Bicycle extends Vehicle { public void move() { System.out.println("페달 밟으며 이동중"); } } public class Car extends Vehicle { public void move() { System.out.println("엑셀 밟으며 이동중");..
상속 Inheritance 상속(inheritance)는 한 클래스에서 다른 클래스의 속성(필드,메소드)들을 갖는것을 말합니다. 자식 클래스는 extends키워드를 통해 부모 클래스의 필드와 메소드를 상속받을 수 있으며, private인 속성과 메소드는 상속되지 않습니다. 상속을 받는 클래스 =: 하위클래스, 자식클래스, sub클래스 상속하는 클래스 =: 상위클래스, 부모클래스, super클래스 class Parent { } class Child extends Parent { } 상속의 특징 다중상속은 불가능하며, 오직 단일 상속만 가능합니다. 한 클래스가 여러 부모 클래스를 가지는 것은 불가능합니다. java.lang.Object클래스가 최상위 클래스이며, 모든 클래스는 Object클래스의 자손입니다...
쉬프트 연산자 shift operator shift v. 옮기다 이동하다 쉬프트 연산자는 비트 표현의 자릿수를 옮기는 연산을 말합니다. 비트 연산자와 마찬가지로 저수준에서 사용할 수 있으며, 2진법 체계의 특성을 응용하여 연산을 할 수 있습니다. 왼쪽 쉬프트 연산 1)); // 101 System.out.println("y>>1 : "+Integer.toBinaryString(y>>1)); // 11 Unsigned 쉬프트 연산 >>> unsigned shift는 쉬프트 연산 후 밀어버린 부분을 전부 0으로 채워줍니다. 단, >>>연산은 음수를 보장하지 않습니다. long b = -2147483648 // 1000 0000 0000 0000 0000 0000 0000 0000 System.out.prin..
연산에 사용되는 기호를 연산자 operator라고 하며, 연산자와 함께 연산되는 값을 피연산자 operand라고 합니다. 이러한 연산자와 피연산자의 연산과정을 연산식 expression이라고 하죠. 산술 연산자 Arithmetic Operator 산술연산자는 부동소수점, 문자형, 정수형과 함께 사용할 수 있으며, 연산의 결과는 숫자 타입(byte, short, int, long ...)으로 결과값이 나옵니다. 더하기 + Addition System.out.println(5+3); // 8 System.out.println(5+3.0); // 8.0 Numeric type: 실수형이 포함된 경우, 실수형으로 캐스팅되어 연산됩니다. System.out.println("Kenneth" + "Log"); // ..
타입 추론 이 글은 참조(https://velog.io/@composite/Java-10-에서-var-재대로-사용하기) 하였습니다. 타입추론은 정적 타이핑을 지원하는 언어에서, 타입이 정해지지 않은 변수에 대해서 컴파일러가 변수의 타입을 스스로 찾아낼 수 있도록 하는 기능을 말합니다. 이를 통해서, 타입을 명시하지 않아도 되며, 코드량을 줄이고 코드의 가독성을 높일 수 있습니다. Java10부터 var키워드가 생겼으며, Java11부터는 이를 통한 람다 타입도 지원합니다. 컴파일러는 개발자가 입력한 초기화 값을 통해 타입을 유추하는데, var는 컴파일러가 타입을 유추할 수 있도록 반드시 데이터를 초기화 해줘야만 합니다. // Java 9 String message = "Good bye, Java 9" /..