보통 인텔리제이로 작업하다보면 서비스나 컨트롤러에 Autowired를 필수적으로 사용한다.

프로젝트의 주된 주입 방식은 Field Injection 방식으로 이루어져 있다

하지만 우리는 무시하고 있지만, 인텔리제이에서는 경고를 띄우고 있다

 

 

편하게 사용하고 있었지만 “권장”되지 않는 방법을 쓰고 있는 셈이다

다른 방법은 무엇이 있을까?

Setter Injection
Constructor Injection

간단하게 생성자와 세터 방법이 있다

 

@Component
public class BaseComponent {

    private final BeanInjected bean;

    @Autowired  // 생략가능
    public BeanInjected(BeanInjected bean) {
        this.bean = bean;
    }
    ...
}

 

@Component
public class BaseComponent {

    private BeanInjected bean;

    @Autowired
    void setBean(BeanInjected bean) {
        this.bean = bean;
    }

    ...
}

 

 

이 중에 생성자보다 세터 방식을 이용한 결과 노란 경고줄을 없앨 수 있다.

 

 

** 참조 사이트 링크1, 링크2

'Dev Back > JAVA' 카테고리의 다른 글

[JAVA] Aes 암복호화 소스코드  (0) 2024.10.25
[adoc] 한글이 깨지는 이슈  (1) 2024.07.03
[JAVA] 접근 제어자의 종류와 사용법  (0) 2024.06.26
[JAVA] AES256 암/복호화  (0) 2024.06.14
[JAVA] @Valid  (0) 2024.06.11

 

파이썬을 해본적이 없어서

GPT에게 간단한 예제를 부탁했다

 

# 필요한 라이브러리 임포트
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report

# 1. 데이터 로드
iris = load_iris()
X = iris.data  # 특성 데이터
y = iris.target  # 레이블 데이터

# 2. 데이터셋 분할 (학습용 80%, 테스트용 20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. 모델 생성
model = RandomForestClassifier(n_estimators=100, random_state=42)

# 4. 모델 학습
model.fit(X_train, y_train)

# 5. 예측 수행
y_pred = model.predict(X_test)

# 6. 평가
accuracy = accuracy_score(y_test, y_pred)
print("모델 정확도:", accuracy)
print("\n분류 리포트:\n", classification_report(y_test, y_pred))

# 7. 예측 예시
sample = np.array([[5.1, 3.5, 1.4, 0.2]])  # 임의의 데이터 샘플
prediction = model.predict(sample)
print("\n예측 결과:", iris.target_names[prediction][0])

 

 

필요한 라이브러리 설치까지 가이드해준다

pip install numpy scikit-learn

 

 

실행하면 다음과 같은 결과를 얻는다

 

 

내용은 앞으로 좀 더 공부해봐야지....

 

Mybatis 를 이용하면 날 수 있는 에러인데,

보통 mapper 설정이 잘못되면 나오게된다

 

mapper 어딘가에 오타라던지

잘못된 경로참조, 또는 잘못된 alias 설정이 원인일 수 있다

 

까다로운 점은 정확하게 어디서 에러가 났는지 알려주지 않고,

Mapper 생성 순서대로 생성하다가 나는 에러이기 때문에

엉뚱한 위치의 Mapper가 범인이라고 로그에 찍혀나올 수 있으니 주의해야 한다

'Dev Back > Spring' 카테고리의 다른 글

[SpringBoot] Error Trace 없애기  (0) 2024.06.02

 

 

 

작업을 하다보니 정상동작하지만

deprecated 된 사항을 발견했다

 

가만히 둘 수는 없지

 

 

project.layout.buildDirectory.dir("libs").get().asFile.path

 

다음과 같이 변경해주었

'Dev Back > Kotlin' 카테고리의 다른 글

[Kotlin] Every Returns... void?  (0) 2024.05.27
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

/**
 * 암/복호화
 * @since 2024.10.24
 */
public class AesUtil {

    private final static String SALT = "CSUZKNWMJAA4ODP8OSWPWIV9VUM8RIR6RABMNFYH6TJ90XUCUN0GFIW5RFC7L0IP";
    private final static String PASSWORD = "MY_PASSWORD_KEY";
    private final static String IV = "7QVRN84YNJJSLHX4N9Y5GPGC0QKSW7HJ";
    private final static String INSTANCE = "PBKDF2WithHmacSHA1";
    private final static String CIPHER_INSTANCE = "AES/CBC/PKCS5Padding";
    private final static String ALGORITHM = "AES";

    /**
     * 암호화
     */
    public static String encrypt(String license) {
        String encryptString = "";
        try {
            Key key = generateKey();
            byte[] encrypted = doFinal(Cipher.ENCRYPT_MODE, key, license.getBytes(StandardCharsets.UTF_8));
            encryptString = new String(Base64.encodeBase64(encrypted));
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
        return encryptString;
    }

    /**
     * 복호화
     */
    public static String decrypt(String decrypedLicense) {
        String decryptString = "";
        try {
            Key key = generateKey();
            byte[] decrypted = doFinal(Cipher.DECRYPT_MODE, key, Base64.decodeBase64(decrypedLicense));
            decryptString = new String(decrypted, StandardCharsets.UTF_8);
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
        return decryptString;
    }

    // 키 생성
    private static Key generateKey() throws NoSuchAlgorithmException, InvalidKeySpecException, DecoderException {
        SecretKeyFactory factory = SecretKeyFactory.getInstance(INSTANCE);
        KeySpec spec = new PBEKeySpec(PASSWORD.toCharArray(), hex(SALT), 1000, 128);
        return new SecretKeySpec(factory.generateSecret(spec).getEncoded(), ALGORITHM);
    }

    // 암/복호화 처리
    private static byte[] doFinal(int mode, Key key, byte[] bytes) throws DecoderException
            , IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException
            , InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
        Cipher cipher = Cipher.getInstance(CIPHER_INSTANCE);
        cipher.init(mode, key, new IvParameterSpec(hex(IV)));
        return cipher.doFinal(bytes);
    }

    // toHex
    public static byte[] hex(String str) throws DecoderException {
        return Hex.decodeHex(str.toCharArray());
    }
}

 

간만에 끄적이다 만들어서 올려보는 자바 암복호화 소스

여기에 적힌 SALT와 IV는 즉석으로 문자열을 생성해 만든것이므로 어디에도 쓰이는 경우가 없다

참고로 쓰려면 다르게 값을 주는 것이 좋을 수도 있다

'Dev Back > JAVA' 카테고리의 다른 글

[JAVA] Field injection is not recommended  (0) 2025.02.21
[adoc] 한글이 깨지는 이슈  (1) 2024.07.03
[JAVA] 접근 제어자의 종류와 사용법  (0) 2024.06.26
[JAVA] AES256 암/복호화  (0) 2024.06.14
[JAVA] @Valid  (0) 2024.06.11

adoc 적용후에 결과를 확인하는데

직접 테스트를 했을 경우에는 문제가 없었는데,

전체 테스트를 진행하니 한글이 깨져벼렸다

 

이유가 뭐지?

 

의심군 1번째

 

필터가 잘못되었나?

 

의심군 2번째

 

메인에서도 

APPLICATION_JSON -> APPLICATION_JSON_UTF8 로 변경

하지만 결과는 변하지 않았다

 

 

"?뀒?뒪?듃?썡?뱶"

 

도대체 뭐가 인코딩 된 것일까? 인코딩 검사를 돌려보았다

String originalStr = "테스트월드";

        byte[] bytes = originalStr.getBytes("utf-8");
        originalStr = new String(bytes);

        String[] charSet = {"utf-8", "euc-kr", "ksc5601", "iso-8859-1", "x-windows-949"};
        for(int i = 0; i<charSet.length; i++){
            for(int j = 0; j<charSet.length; j++){
                try{
                    System.out.println("[" + charSet[i] + "," + charSet[j] + "]" + new String(originalStr.getBytes(charSet[i]), charSet[j]));
                } catch (UnsupportedEncodingException e){
                    e.printStackTrace();
                }
            }
        }

 

인코딩 확인!

utf-8로 나왔는데 x-windows-949로 인코딩이 되었다?

 

x-windows-949 로 구글링

 

검거!

 

해당 부분을 UTF8로 변경하니 한글 깨지는 것이 해결되었다

'Dev Back > JAVA' 카테고리의 다른 글

[JAVA] Field injection is not recommended  (0) 2025.02.21
[JAVA] Aes 암복호화 소스코드  (0) 2024.10.25
[JAVA] 접근 제어자의 종류와 사용법  (0) 2024.06.26
[JAVA] AES256 암/복호화  (0) 2024.06.14
[JAVA] @Valid  (0) 2024.06.11

자바에서는 네 가지 접근 제어자를 제공합니다: private, default(아무것도 지정하지 않음), protected, public. 각각의 접근 제어자는 클래스 멤버의 가시성을 제어하는 데 사용됩니다.

 

왜냐하면 private 접근 제어자는 클래스 내부에서만 접근이 가능하게 하여, 클래스의 캡슐화를 강화하기 때문입니다. 이는 클래스의 내부 구현을 외부로부터 보호하는 데 중요한 역할을 합니다.

 

default 접근 제어자는 같은 패키지 내의 클래스들 사이에서만 접근이 가능하게 합니다. 이는 패키지 단위의 모듈화를 지원하며, 패키지 외부에는 불필요한 클래스의 노출을 방지합니다.

 

protected 접근 제어자는 같은 패키지 내의 클래스 또는 다른 패키지의 서브 클래스에서 접근이 가능하게 합니다. 이는 상속 관계에 있는 클래스들 사이의 접근을 허용하면서도, 외부로의 불필요한 노출을 제한합니다.

 

public 접근 제어자는 어떤 클래스에서든 접근이 가능하게 합니다. 이는 공개 API를 구현할 때 주로 사용되며, 외부에서 사용될 수 있는 클래스나 메소드를 명시적으로 표시하는 데 사용됩니다.

 

각 접근 제어자의 사용법을 이해하고 적절히 적용하는 것은 객체 지향 프로그래밍에서 중요한 기술 중 하나입니다.

'Dev Back > JAVA' 카테고리의 다른 글

[JAVA] Aes 암복호화 소스코드  (0) 2024.10.25
[adoc] 한글이 깨지는 이슈  (1) 2024.07.03
[JAVA] AES256 암/복호화  (0) 2024.06.14
[JAVA] @Valid  (0) 2024.06.11
[JAVA] 인텔리제이 자바 빌드 버전 바꾸기  (0) 2024.05.28

 

AES256

- Advanced Encryption Standard 의 줄임말

- 256비트 길이의 키를 사용하는 암호화 알고리즘

- 대칭키 암호화

- 높은 보안성

- 속도가 빠름

 

 

 AES 개인키 설정

private final static String privateKey = "worldProject1234";

 

위는 그냥 자바 문자열로 선언해두었지만, 환경설정 파일에 세팅한 값을 불러올 수도 있다

 

 

AES 암복호화

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.apache.commons.codec.binary.Hex;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

@Slf4j
@Component
public class AESUtil {

    private final static String privateKey = "{16바이트 개인키 설정}";

    private final static String IVparam = "{16바이트 IV값 설정}";
    private final static String UTF8 = "UTF-8";
    private final static String AES = "AES";
    private final static String AESInstance = "AES/CBC/PKCS5Padding";

    public static String encrypt(String str) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(privateKey.getBytes(UTF8), AES);
            IvParameterSpec IV = new IvParameterSpec(IVparam.getBytes(UTF8));

            Cipher c = Cipher.getInstance(AESInstance);

            c.init(Cipher.ENCRYPT_MODE, secretKey, IV);

            byte[] encrypte = c.doFinal(str.getBytes(StandardCharsets.UTF_8));

            return Hex.encodeHexString(encrypte);

        } catch (Exception e) {
            log.error("Error while encrypt: {}", e);
            return null;
        }
    }

    public static String decrypt(String str) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(privateKey.getBytes(UTF8), AES);
            IvParameterSpec IV = new IvParameterSpec(IVparam.getBytes(UTF8));

            Cipher c = Cipher.getInstance(AESInstance);

            c.init(Cipher.DECRYPT_MODE, secretKey, IV);

            byte[] decode = Hex.decodeHex(str.toCharArray());

            return new String(c.doFinal(decode), UTF8);

        } catch (Exception e) {
            log.error("Error while decrypt: {}", e);
            return null;
        }
    }
}

 

 

 

Hex 의 경우 추가로 라이브러리가 필요할 수 있다

implementation group: 'commons-codec', name: 'commons-codec', version: '1.15'

 

 

 

암복호화가 잘 되는지 테스트

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

class AESUtilTest {

    final String test = "test1234";
    final String aesTest = "7b0934575f6e21a322912bb3adda16da";

    @Test
    void encrypt() {
        Assertions.assertEquals(AESUtil.encrypt(test), aesTest);
    }

    @Test
    void decrypt() {
        Assertions.assertEquals(AESUtil.decrypt(aesTest), test);
    }
}

'Dev Back > JAVA' 카테고리의 다른 글

[adoc] 한글이 깨지는 이슈  (1) 2024.07.03
[JAVA] 접근 제어자의 종류와 사용법  (0) 2024.06.26
[JAVA] @Valid  (0) 2024.06.11
[JAVA] 인텔리제이 자바 빌드 버전 바꾸기  (0) 2024.05.28
[JAVA] @JsonProperty  (0) 2024.05.27

+ Recent posts