Java&Jsp&Servlet2025. 2. 25. 10:58

오랜만에 하드코딩 할려니 모든것이 혼란 스럽다. 정리가 필요하다.

구분 사용법 설명
<% %> 스크립틀릿 (Scriptlet) JSP에서 Java 코드 실행 (service() 메서드 내부)
<%! %> 선언문 (Declaration) JSP의 멤버 변수 또는 메서드 선언 (service() 메서드 외부)
<%@ %> 디렉티브 (Directive) JSP 페이지의 설정 (page, include, taglib)

 

<% %> (스크립틀릿, Scriptlet)

  • JSP 내부에서 Java 코드를 실행할 때 사용됩니다.
  • JSP가 실행될 때 서블릿 코드로 변환되며, service() 메서드 안에 들어갑니다.
  • JSP 페이지 내에서 동적인 처리를 할 때 사용됩니다.
<%
    String message = "Hello, JSP!";
    out.println(message);
%>

변환된 서블릿 코드

public void _jspService(HttpServletRequest request, HttpServletResponse response) throws IOException {
    String message = "Hello, JSP!";
    out.println(message);
}

 

<%! %> (선언문, Declaration)

  • JSP 페이지에서 멤버 변수 또는 메서드를 선언할 때 사용됩니다.
  • service() 메서드 바깥에서 선언되므로, 전역 변수 또는 메서드 정의가 가능합니다.
<%! 
    int count = 0;  // 멤버 변수 선언
    public int getNextCount() { 
        return ++count; 
    }
%>

변환된 서블릿 코드

public class MyJspServlet extends HttpServlet {
    int count = 0;  // 클래스 멤버 변수

    public int getNextCount() {
        return ++count;
    }

    public void _jspService(HttpServletRequest request, HttpServletResponse response) throws IOException {
        out.println("다음 번호: " + getNextCount());
    }
}

 

<%@ %> (디렉티브, Directive)

  • JSP 페이지의 설정 및 서블릿 변환 방식을 정의하는 데 사용됩니다.
  • JSP 페이지에 대한 메타정보를 지정합니다.
  • 주요 디렉티브:
    • page: JSP 페이지의 속성 설정 (예: 인코딩, 오류 페이지 등)
    • include: 다른 JSP 파일 포함
    • taglib: 커스텀 태그 라이브러리 선언
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%@ page import="java.util.Date" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:forEach var="i" begin="1" end="5">
    <p>번호: ${i}</p>
</c:forEach>

 

정리가 깔끔하죠! 맞습니다. ChatGPT 님이 정리해 주셨습니다.

Posted by 비니미니파파
JavaScript&Platform/jQuery2025. 1. 21. 14:07

[jquery] select on change / jquery value/text 가져오기

HTML

<select id="example">
  <option value="1">Option 1</option>
  <option value="2">Option 2</option>
  <option value="3">Option 3</option>
</select>

Jquery

$('#example').on('change', function () {
  const selectedVal = $(this).val();  // 선택된 option 의 value
  console.log('Selected Value:', selectedVal);
  const selectedText = $(this).find('option:selected').text(); // 선택된 option 의 text
  console.log('Selected Text:', selectedText);
});
Posted by 비니미니파파
Database/Oracle2025. 1. 10. 17:13

TEST 스키마가 기본

TEST2 스키마에 SP_TEST 프로시져를 생성 후 실행 했더니 오류 발생

ORA-00900 권한이 없어 오류가 발생 함.

GRANT EXECUTE ON TEST2.SP_TEST TO TEST;

권한 부여

문제 해결

끝!

 

Posted by 비니미니파파
Database/Oracle2024. 12. 13. 13:22

단순한 case when then else end 를 대체 할수 있다.

DECLARE
    data_type VARCHAR2(50); -- 변수 선언
    result VARCHAR2(50);  -- 결과를 저장할 변수
BEGIN
    -- data_type 변수에 값 할당
    data_type := 'C'; -- 여기서 값을 변경하여 테스트 가능

    -- DECODE를 사용하여 결과 저장
    SELECT DECODE(data_type, 'A', '1111', 'B', '2222', 'C', '3333', 'D', '444', '0000')
    INTO result
    FROM DUAL;

    -- 결과 출력
    DBMS_OUTPUT.PUT_LINE('TYPE: ' || data_type || ', result: ' || result);
END;

Posted by 비니미니파파
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 비니미니파파
Database/Oracle2024. 7. 12. 11:40

Table 복사

* 테이블 변경 시 테이블 자체를 백업 해 놓고 싶을때 자주 사용.

CREATE TABLE [TBL_NEW_NAME] AS SELECT * FROM [TBL_NAME]

CREATE TABLE TBL_MEMBER_BACKUP AS SELECT * FROM TBL_MEMBER

 

Posted by 비니미니파파

삼항 연산자
count = ( $("#count").val() != "" ) ? parseInt($("# count").val()) : 0;

논리 연산자
count = parseInt($("# count").val()) || 0;

  • 삼항 연산자는 조건부 선택을 통해, 조건이 true인지 false인지에 따라 서로 다른 값을 반환
  • || 연산자는 단순 논리 OR로, 첫 번째 truthy 값을 반환

단순 값이 없을때 default 값을 정해야 할때. || (or 연산자)를 사용하면 편함.

Posted by 비니미니파파
Framework2024. 6. 21. 10:07

commit 오류

프로젝트(마우스오른쪽클릭) > team > Refresh/cleanup

끝!

 

Posted by 비니미니파파
Database/Oracle2024. 5. 22. 15:58

주로 사용하는 표현

column_name like '%'|| '검색어' || '%'

대소문자 구분 없이 검색하려면

UPPER(column_name) like '%'|| UPPER( '검색어') || '%'

regexp_like 로 한방에

regexp_like( column_name , '검색어' , 'i' )

대소문자 구별해야 할 때는
regexp_like( column_name , '검색어' )

 

Posted by 비니미니파파
Database/Oracle2024. 4. 24. 15:50

사용 /*+ parallel( ) */ 

SELECT
      /*+ parallel(TBL1,4) parallel(TBL2,4) */ 
FROM TBL_TEST1 TBL1, TBL_TEST2 TBL2
WHERE TBL1.USER_NAME = TBL2.USER_NAME

임시 정리

Posted by 비니미니파파
Python2023. 6. 1. 17:34

chatGPT 에게 LSTM 간단한 예제를 만들어 달라고 했더니 이런걸 만들어 준다.

LSTM(Long Short-Term Memory)은 순환 신경망(RNN)의 한 종류로서, 장기 의존성(long-term dependency)을 학습하기에 효과적인 구조를 가진 모델입니다. LSTM은 시계열 데이터나 자연어 처리와 같이 순차적인 데이터를 다루는데 주로 사용됩니다. by ChatGPT

 

import numpy as np
import tensorflow as tf

# 입력 시계열 데이터 생성
# 간단한 사인 함수를 사용하여 시계열 데이터를 생성합니다.
def generate_sequence(length):
    freq = np.random.uniform(0.1, 1.0)
    x = np.sin(np.arange(0, length) * freq)
    return x

# 데이터셋 생성
def generate_dataset(seq_length, n_samples):
    X = []
    Y = []
    for _ in range(n_samples):
        seq = generate_sequence(seq_length)
        X.append(seq[:-1])  # 입력 시퀀스
        Y.append(seq[1:])   # 출력 시퀀스
    X = np.array(X)
    X = np.reshape(X, [n_samples, seq_length-1, 1])
    Y = np.array(Y)
    Y = np.reshape(Y, [n_samples, seq_length-1, 1])
    return X, Y

# LSTM 모델 생성
def create_lstm_model(seq_length):
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.LSTM(20, input_shape=(seq_length-1, 1), return_sequences=True))
    model.add(tf.keras.layers.Dense(1, activation='linear'))
    return model

# 데이터셋 생성
seq_length = 10
n_samples = 1000
X, Y = generate_dataset(seq_length, n_samples)

# LSTM 모델 생성
model = create_lstm_model(seq_length)

# 모델 컴파일
model.compile(loss='mse', optimizer='adam')

# 모델 훈련
model.fit(X, Y, epochs=10, batch_size=32)

# 새로운 시퀀스 생성 및 예측
new_seq = generate_sequence(seq_length)
new_input = new_seq[:-1]
new_input = np.reshape(new_input, [1, seq_length-1, 1])
predicted_output = model.predict(new_input)
print("입력 시퀀스:", new_seq[:-1])
print("예측된 다음 값:", predicted_output.flatten())

 

만들어진 코드를 코랩(colab)에서 실행

잘 된다.

Posted by 비니미니파파