Framework2024. 10. 15. 11:00

@Autowired

  • Spring 프레임워크에서 제공하는 애노테이션입
  • **타입(Type)**을 기준으로 의존성 주입을 수행
  • 기본적으로는 필드, 세터 메서드, 생성자에 사용할 수 있음
  • 타입에 맞는 빈이 여러 개 있을 경우, @Qualifier를 함께 사용하여 특정 빈을 지정
  • 주입할 빈이 없을 경우, 예외가 발생
    required=false로 설정하면, 주입할 빈이 없어도 예외를 발생시키지 않는다.

 

@Autowired
private MyService myService;


@Autowired(required = false)
private MyService myService;

 

 @Resource

  • JDK 표준(JSR-250) 애노테이션으로, Spring 외의 Java EE 환경에서도 사용
  • **이름(Name)**을 기준으로 의존성 주입
  • 이름을 먼저 검색하고, 이름으로 주입할 빈이 없으면 타입을 기준으로 빈을 주입
  • 기본적으로 필드 또는 세터 메서드에 사용할 수 있음
  • 주입할 빈을 이름으로 명시하고 싶을 때 사용
@Resource(name = "myService")
private MyService myService;

 

주요 차이점 요약

  1. 주입 방식:
    • @Autowired는 타입을 기준으로 주입
    • @Resource는 기본적으로 이름을 기준으로 주입 (이름으로 찾지 못할 경우 타입으로 주입)
  2. 애노테이션 출처:
    • @Autowired는 Spring 전용 애노테이션
    • @Resource는 Java 표준 애노테이션(JSR-250)으로, Spring 외의 Java EE 환경에서도 사용될 수 있음
  3. 추가 설정:
    • @Autowired는 @Qualifier와 함께 사용할 수 있어 여러 빈 중 특정 빈을 선택할 수 있음
    • @Resource는 name 속성을 통해 빈 이름을 지정할 수 있음

어느 것을 사용할지

  • Spring에 종속적인 애플리케이션에서는 **@Autowired**를 더 자주 사용
  • 표준 Java 애노테이션을 선호하거나 이름 기반 주입이 필요한 경우 **@Resource**를 사용할 수 있음.
Posted by 비니미니파파

let obj = {};

  • 이것은 객체 리터럴 방식으로 객체를 생성하는 가장 간결한 방법
  • 자바스크립트에서 객체를 만들 때 많이 사용되며, 성능 면에서도 new Object()보다 더 빠르다고 알려져 있다
  • 사용하기 쉽고 직관적

let obj = new Object();

  • 이것은 자바스크립트의 내장 생성자 함수인 Object()를 사용해 객체를 생성하는 방법
  • 객체를 생성할 때 별도의 매개변수를 전달해야 하는 경우에 사용할 수 있다
  • 하지만 일반적인 객체 생성에서는 거의 사용되지 않는다

주요 차이점

  • 구문: let foo = {};는 객체 리터럴 방식, let foo = new Object();는 생성자 함수를 사용한 방식
  • 성능: 객체 리터럴 방식이 더 간결하고 성능이 약간 더 우수
  • 사용성: 대부분의 상황에서 객체 리터럴 방식을 사용하는 것이 일반적이고, 더 직관적

 

Posted by 비니미니파파
Database2024. 9. 11. 10:26

정규화(normalization) 에 대해 ChatGPT 에 물어 보았다.

관계형 데이터베이스 설계 시 데이터 중복을 줄이고 무결성을 유지하기 위한 정규화 과정입니다. 각 단계에서 데이터 구조가 개선됩니다.

1차 정규화 (1NF)

  • 목표: 테이블 내 모든 필드가 원자값(더 이상 나눌 수 없는 값)을 갖도록 만듦.
  • 조건: 각 컬럼에 중복되는 데이터나 여러 값이 포함되지 않도록, 하나의 셀에는 하나의 값만 존재해야 함.

예시:

  • 전화번호가 하나의 컬럼에 "010-1234-5678, 010-9876-5432"처럼 들어있으면 1NF가 아님.
  • 이를 각각의 행으로 분리하거나 별도의 테이블로 분리하여 원자값을 만듦.

 

2차 정규화 (2NF)

  • 목표: 부분 함수 종속을 제거.
  • 조건: 1NF를 만족하고, 테이블의 모든 비주요 속성이 기본키에 완전 함수 종속되어야 함. 즉, 기본키의 일부분에만 종속되는 속성들을 제거.

예시:

  • 학생 테이블에서 학번과 과목으로 성적을 관리하는 경우, 과목명에 대한 정보는 학번과 관계없이 과목에만 종속됨. 이를 별도의 테이블로 분리하여 성적 테이블은 학번과 과목만 다루고, 과목 정보는 과목 테이블로 관리.

 

3차 정규화 (3NF)

  • 목표: 이행적 함수 종속을 제거.
  • 조건: 2NF를 만족하고, 기본키가 아닌 속성들이 서로 종속되지 않아야 함. 즉, 비주요 속성이 다른 비주요 속성에 의존하지 않도록 분리.

예시:

  • 직원 테이블에 직원 ID, 부서 ID, 부서명 등이 있는 경우, 부서명은 부서 ID에만 종속되어야 함. 이때 부서 정보를 따로 분리하여 관리.

이러한 정규화 과정을 통해 데이터 중복을 최소화하고, 데이터 일관성과 무결성을 유지할 수 있습니다.

더 쉽게 설명해달라고 해보았다.

정규화는 데이터베이스에서 데이터를 깔끔하고 효율적으로 관리하기 위한 과정이에요. 1차, 2차, 3차 정규화는 데이터를 단계별로 더 잘 정리하는 방법입니다. 쉽게 설명하면:

1차 정규화 (1NF)

  • 뭐하는 거야?: 각 칸에 하나의 정보만 넣기.
  • 예시: "전화번호" 칸에 여러 개의 번호가 들어 있으면 안 돼요. 각각의 번호를 따로 칸에 넣어야 해요.
    • 잘못된 예시: 전화번호: 010-1234-5678, 010-9876-5432
    • 고친 예시: 전화번호: 010-1234-5678 (각 번호를 따로 관리)

 

2차 정규화 (2NF)

  • 뭐하는 거야?: 주요한 정보(기본키)에만 의존하도록 정리하기.
  • 예시: 학생의 학번과 과목별 성적을 기록하는데, 과목 이름과 학번이 섞여 있으면 안 돼요. 과목 정보는 따로 테이블로 만들어서 관리하면 깔끔해요.
    • 잘못된 예시: 학번 + 과목 이름 + 성적
    • 고친 예시: 과목은 따로 과목 테이블에서 관리하고, 성적 테이블은 학번과 과목 ID만 기록.

 

3차 정규화 (3NF)

  • 뭐하는 거야?: 불필요한 연결 없애기.
  • 예시: 직원 테이블에 부서 이름이 들어가 있으면, 나중에 부서 이름이 바뀔 때 여러 곳을 고쳐야 할 수 있어요. 이럴 땐 부서 ID만 넣고, 부서 정보는 부서 테이블에서 따로 관리하면 좋아요.
    • 잘못된 예시: 직원ID + 부서 이름
    • 고친 예시: 직원ID + 부서ID (부서 이름은 부서 테이블에서 따로 관리)

정리하면:

  1. 각 칸에 하나의 정보만 넣고,
  2. 중복된 정보는 따로 떼어내서,
  3. 관련 없는 정보끼리는 따로 보관해요.

이렇게 하면 데이터가 덜 중복되고, 나중에 변경하기 쉬워집니다!

Posted by 비니미니파파
Java&Jsp&Servlet2024. 8. 27. 10:50

DateTimeFormatter 을 사용해야 하는 이유? ( by ChatGPT)

  • DateTimeFormatter: 자바 8 이상에서 도입된 java.time 패키지는 국제 표준 ISO-8601을 기본으로 하여 설계되었습니다. 따라서 DateTimeFormatter를 사용하면 국제 표준에 더 잘 부합하는 코드를 작성할 수 있습니다.
  • SimpleDateFormat: 자바 초기 버전에서 도입된 만큼 현대적 표준을 따르지 않는 부분이 있습니다.

특히 SimpleDateFormat 은 스레드에 안전하지 않는다고 한다.

그래서, DateTimeFormatter 을 이용한 날짜, 시간 더하기

package study.d4emon.test;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;

public class DateAddLocaleDate {

	public static void main(String[] args) {
		
        // LocalDate
        LocalDate localeToday = LocalDate.now();

        // Firtday of Month
        LocalDate firstDayOfMonth = localeToday.with(TemporalAdjusters.firstDayOfMonth());

        // DateTimeFormmater
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        // today
        String today = localeToday.format(formatter);

        System.out.println("Today : " + today);

        // firstDay
        String firstDay = firstDayOfMonth.format(formatter);
        System.out.println("FirstDay : " + firstDay);

        // 하루 더하기
        String addDate = localeToday.plusDays(+1).format(formatter);
        System.out.println("Add 1 Day : " + addDate);

        // 한달 더하기
        addDate = localeToday.plusMonths(+1).format(formatter);
        System.out.println("Add 1 Month : " + addDate);

        // 1년 더하기
        addDate = localeToday.plusYears(+1).format(formatter);
        System.out.println("Add 1 year : " + addDate);

        // 시분초 까지 표시하려면
        System.out.println("시분초 까지 표시하려면 ....");
        formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime now = LocalDateTime.now();
        System.out.println("DateTime: " + now.format(formatter));

		// 15초 더하기
        LocalDateTime nextSecond = now.plusSeconds(15); 
        System.out.println("Add 15 Sec: " + nextSecond.format(formatter));

		// 30분 더하기
        LocalDateTime nextMinute = now.plusMinutes(30); 
        System.out.println("Add 30 Min: " + nextMinute.format(formatter));

		// 1시간 더하기
        LocalDateTime nextHour = now.plusHours(1); 
        System.out.println("Add 1 Hour : " + nextHour.format(formatter));
        
	}

}

 

Posted by 비니미니파파
Database/Oracle2024. 8. 16. 10:42

소숫점 자리수를 표시할 때 화면에서 정렬을 위해 0으로 채워달라는 경우가 있다.

예 ) 0.123 -> 0.12300

FM (Fill Mode) 을 사용하자.

SELECT TO_NUMBER('0.123') AS VAL FROM DUAL

-> 0.123

SELECT TO_CHAR(TO_NUMBER('0.123'),'FM999,999,990.00000') AS VAL FROM dual;

-> 0.12300

많이 사용하는 라운드(ROUND:반올림)와 같이

SELECT TO_CHAR(ROUND(TO_NUMBER('0.123'),5),'FM999,999,990.99999') AS VAL FROM dual;

FM 에 대해서 공부하려면 

https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements004.htm#SQLRF00210

 

Format Models

The total length of a datetime format model cannot exceed 22 characters. The default datetime formats are specified either explicitly with the NLS session parameters NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT, and NLS_TIMESTAMP_TZ_FORMAT, or implicitly with the

docs.oracle.com

 

끝 

Posted by 비니미니파파