java
JPA @ManyToMany 지양 이유
JPA @ManyToMany 지양 이유 JPA @ManyToMany DB에서는 1:1, 1:N, N:1, N:M 등의 관계가 존재 관계형 데이터베이스의 정규화된 테이블 2개로는 N:M 관계를 표현 불가능 데이터베이스에서 표현하기 위해서는 두 테이블 각각과 N:1 관계를 가지는 중간 테이블을 만들어야 함 JPA에서는 @ManyToMany 어노테이션을 통해 N:M 관계를 논리적으로 지원 편리해 보이지만, 실무에서는 사용이 지양됨 실제 구현에서는 중간에 매핑을 위한 테이블이 숨겨져서 생성되기 때문 이 테이블은 매핑 정보 외의 추가 정보를 담지 못하기 때문에 기능이 제한됨 또한 숨겨져 있기 때문에 예상하지 못한 쿼리가 많이 나갈 수도 있음 @ManyToMany를 사용하지 않고, 중간 테이블을 직접 엔티티로 만들어 주면 됨 중간 테이블에서 FK 두개를 가지고, 두 개의 테이블들과 N:1 관계를 가지면 됨 매핑 정보 외의 추가 정보도 넣을 수 있음 References https://ict-nroo.
read morejava
Java Synchronized
Java Synchronized Java Synchronized 자바에서 임계 영역 (critical section)에 대한 동기화를 수행하기 위해 사용하는 예약어 임계 영역인 메소드 혹은 코드 블럭 앞에 synchronized 예약어를 붙이면 됨 즉, 한 개의 스레드만 해당 임계 영역에 접근 가능 당연하지만 synchronized 예약어를 많이 쓸수록, 스레드가 block 되므로 성능 저하 발생 메소드에 사용하는 방법 public synchronized void increase() { count++; } 코드 블럭에 사용하는 방법 public void increase() { // Non-critical section synchronized(this) { count++; } // Non-critical section } References https://kadosholy.
read morejava
Vue Spring Gather
Vue Spring Gather Vue에서 빌드한 페이지를 Spring에서 사용하는 방법 Vue-router 설정 Hash 방식이 아닌 History 방식 사용 vue.config.js의 publicPath 사용하지 말기 Vue 404 페이지 설정 404 페이지를 만들고 router 목록과 매칭되지 않는 URL은 404 페이지로 리다이렉션 path: "/:pathMatch(.*)*를 사용 vue.config.js의 outputDir을 다음과 같이 설정하고 빌드 ${SPRING_LOCATION}/src/main/resources/static Spring에 다음 controller 추가 @Controller public class WebErrorController implements ErrorController { @GetMapping("/error") public String redirectRoot(){ return "index.html"; } } 설명 Vue는 Single Page Application Vue-router를 사용하더라도 실제로 빌드된 페이지는 index.
read morejava
Java BigInteger
Java BigInteger Java BigInteger Java에서 long을 넘어서는 범위(대략 922경)의 정수를 표현하기 위한 클래스 문자열로 숫자를 표현하기 때문에 모든 숫자를 다룰 수 있음 내장 패키지가 아님. java.math.BigInteger 패키지에 존재 사용법 // 1. 초기화 BigInteger b1 = new BigInteger("2222"); long l = 2222; BigInteger b2 = BigInteger.valueOf(l) // 2. Binary 연산 (divide, remainder, subtract, and, or, max 연산 등도 가능) BigInteger b3 = b1.add(b2); BigInteger b4 = b1.multiply(b2); // 3. Unary 연산 BigInteger b5 = b1.
read morejava
Java var
Java var Java var Java 10부터는 var라는 문법을 통해 타입 추론 가능 var x = 32;와 같이 사용하면 컴파일러가 타입을 추론해 줌 컴파일 시에 추론하기 때문에 런타임에 영향을 주지 않음 반복문에서 특히 유용. 다음 코드에서 var를 쓰지 않는다면 Map.Entry<String, Integer>를 사용해야 함 Map<String, Integer> store = new HashMap<>(); for (var s: store.entrySet()) { s.getKey(); s.getValue(); } 주의 사항 지역 변수에서만 사용 가능, 클래스 멤버 변수에는 불가능 초기화가 반드시 필요 null, 배열, lambda 식에는 사용 불가 var는 예약어가 아님.
read morejava
View Resolver
View Resolver View Resolver Controller가 반환하는 논리적인 View 이름을 실제 View 객체로 매핑하는 컴포넌트 다음과 같은 View Resolver 존재 InternalResourceViewResolver: JSP를 사용하는 경우 ResourceBundleViewResolver: JSP 외의 View 를 사용하는 경우 XmlViewResolver: View 매핑 정보를 XML 파일에서 읽는 경우 여러 View Resolver들의 우선 순위를 정할 수 있음 References 스프링 입문 - 김영한 (https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8)
read morejava
Java Array Literal
Java Array Literal Java Array Literal 자바에서는 배열을 선언과 동시에 초기화 할 수 있음. 이 때는 다음과 같이 선언 가능 String[] words = { "a", "b", "c" }; 그러나 선언 후 초기화 하거나, 함수의 인자로 넘겨주는 등 배열의 literal 값을 사용해야 하는 경우도 존재 이 경우 다음과 같이 사용하면 오류가 발생 public static int len(String[] a) { return a.length; } public static void main(String[] args) { len({ "a", "b", "c" }); } 배열의 literal을 사용하는 경우에는 다음과 같이 new 연산자를 붙여서 사용해야 함 len(new String[] { "a", "b", "c" }); References https://aroundck.
read morejava
Spring Data JPA
Spring Data JPA Spring Data JPA JPA에서 repository를 제작할 때 마다 CRUD 메소드를 작성해야 함 Spring Data JPA는 CRUD 메소드를 직접 작성할 필요 없이, 자동으로 제공해 주는 라이브러리 이를 통해 구현 클래스 없이 인터페이스만으로 개발이 가능 핵심 비즈니스 로직 작성에 집중 가능 JPA를 잘 아는 상태에서 사용하는 것이 추천됨 사용 방법 사용할 repository를 인터페이스로 선언하고, JpaRepository를 상속받음 JpaRepository의 제너릭에는 사용할 객체(엔티티)와 해당 객체에서 PK로 사용할 자료형을 줘야 함 아래 예시는 Long을 PK로 가지는 Member라는 객체를 사용 이 repository에서 기본적인 CRUD 메소드들을 사용 가능 아래 예시는 findByName 메소드를 선언하는 경우 name에 해당하는 Member 객체를 반환하는 메소드가 자동으로 생성 별도의 구현을 작성할 필요가 없음 메소드 이름을 바탕으로 쿼리를 만들어 줌 public interface SpringDataJpaMemberRepository extends JpaRepository<Member,Long> { Optional<Member> findByName(String name); } References 스프링 입문 - 김영한 (https://www.
read morejava
JPA
JPA JPA Java Persistence API의 약자 자바 ORM 인터페이스의 모음으로, 실제 구현체와 매핑해주기 위해 사용되는 프레임워크 대표적인 구현체로 Hibernate 존재 자바 객체 중심으로 개발할 수 있도록 도와 줌 JPA에 객체를 넘기면, JDBC API를 사용해 SQL을 매핑하고, DB와 통신 반복적인 작업을 JPA가 대신 해 줌 SQL 중심적인 개발에서 벗어남으로 인해, 생산성 증대 스프링에서는 Spring Data JPA라는 모듈을 통해 JPA를 더욱 쉽게 사용하게 해 줌 JPA의 최적화 기능 캐싱 기능을 이용해 한 트랜잭션 안에서는 같은 대상을 조회 시 같은 엔티티를 반환 쓰기 연산의 경우 커밋하는 순간 한꺼번에 SQL을 전송 객체의 값이 실제로 필요한 시점에 쿼리를 날리는 지연 로딩 사용 가능 한 번에 연관된 객체를 모두 가져오는 즉시 로딩과 대비 상황에 따라 지연 로딩과 즉시 로딩을 선택 가능 References https://dbjh.
read morejava
@Controller @RestController
@Controller @RestController @Controller @RestController spring에서 클래스를 controller로 설정하기 위한 어노테이션이나, 차이가 존재 @Controller MVC 패턴에서의 controller Model 객체에 데이터를 담아 view 를 반환 View resolver를 이용해 해당하는 view 를 찾음 @RestController 데이터(객체) 그 자체를 반환 데이터를 JSON / XML 등의 형태로 HTTP 응답에 담아 보냄 클래스 내의 모든 메소드가 그 데이터 자체로 반환됨 @Controller에 @ResponseBody 어노테이션을 합친 형태 References https://dev-coco.tistory.com/84
read more