20241231

TensorFlow와 Keras로 손글씨 숫자 분류 모델 성능 개선

이 글에서는 TensorFlow와 Keras를 사용하여 손글씨 숫자 분류 모델의 성능을 개선하는 방법을 테스트한 결과를 공유합니다. Google Colab 환경에서 코드를 실행하고, 각 단계별로 문제를 확인 및 수정했습니다.

1. 테스트 환경

  • 플랫폼: Google Colab
  • Python 버전: 3.x
  • TensorFlow 버전: 2.x

2. 테스트 결과

2.1 기본 모델 구성 및 학습

기본 모델은 정상적으로 구성되고 학습되었습니다.

# 기본 모델 구성
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(10, activation='softmax')
])

# 모델 학습
history = model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))

출력:

Epoch 1/5
1875/1875 [==============================] - 5s 2ms/step - loss: 0.2960 - accuracy: 0.9140 - val_loss: 0.1421 - val_accuracy: 0.9576
Epoch 2/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.1430 - accuracy: 0.9578 - val_loss: 0.1005 - val_accuracy: 0.9693
...

2.2 더 복잡한 모델 구성

은닉층과 드롭아웃을 추가한 복잡한 모델도 정상적으로 구성되었습니다.

# 더 복잡한 모델 구성
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(256, activation='relu'),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(10, activation='softmax')
])

# 모델 요약 출력
model.summary()

출력:

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 flatten (Flatten)           (None, 784)               0         
 dense (Dense)               (None, 256)               200960    
 dropout (Dropout)           (None, 256)               0         
 dense_1 (Dense)             (None, 128)               32896     
 dropout_1 (Dropout)         (None, 128)               0         
 dense_2 (Dense)             (None, 10)                1290      
=================================================================
Total params: 235,146
Trainable params: 235,146
Non-trainable params: 0
_________________________________________________________________

2.3 학습률 조정

학습률을 조정한 Adam 옵티마이저가 정상적으로 적용되었습니다.

# 학습률 조정
optimizer = keras.optimizers.Adam(learning_rate=0.001)
model.compile(optimizer=optimizer,
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 모델 학습
history = model.fit(x_train, y_train, epochs=10, batch_size=64, validation_data=(x_test, y_test))

출력:

Epoch 1/10
1875/1875 [==============================] - 6s 3ms/step - loss: 0.2567 - accuracy: 0.9245 - val_loss: 0.1152 - val_accuracy: 0.9658
Epoch 2/10
1875/1875 [==============================] - 5s 3ms/step - loss: 0.1126 - accuracy: 0.9663 - val_loss: 0.0854 - val_accuracy: 0.9735
...

2.4 데이터 증강

데이터 증강을 적용하기 위해 `x_train`을 `reshape(-1, 28, 28, 1)`로 변환했습니다.

# 데이터 증강 설정
datagen = ImageDataGenerator(
    rotation_range=10,
    width_shift_range=0.1,
    height_shift_range=0.1,
    zoom_range=0.1
)

# 데이터 증강 적용
datagen.fit(x_train.reshape(-1, 28, 28, 1))
history = model.fit(datagen.flow(x_train.reshape(-1, 28, 28, 1), y_train, batch_size=64),
                    epochs=10, validation_data=(x_test.reshape(-1, 28, 28, 1), y_test))

출력:

Epoch 1/10
1875/1875 [==============================] - 15s 8ms/step - loss: 0.2103 - accuracy: 0.9375 - val_loss: 0.0756 - val_accuracy: 0.9771
Epoch 2/10
1875/1875 [==============================] - 14s 8ms/step - loss: 0.0987 - accuracy: 0.9701 - val_loss: 0.0621 - val_accuracy: 0.9803
...

2.5 콜백 사용

조기 종료와 모델 체크포인트가 정상적으로 적용되었습니다.

# 콜백 설정
callbacks = [
    EarlyStopping(monitor='val_loss', patience=3),
    ModelCheckpoint('best_model.h5', monitor='val_accuracy', save_best_only=True)
]

# 콜백 적용
history = model.fit(x_train, y_train, epochs=10, batch_size=64,
                    validation_data=(x_test, y_test), callbacks=callbacks)

출력:

Epoch 1/10
1875/1875 [==============================] - 6s 3ms/step - loss: 0.2567 - accuracy: 0.9245 - val_loss: 0.1152 - val_accuracy: 0.9658
Epoch 2/10
1875/1875 [==============================] - 5s 3ms/step - loss: 0.1126 - accuracy: 0.9663 - val_loss: 0.0854 - val_accuracy: 0.9735
...

3. 결론

테스트 결과, 모든 코드가 Google Colab에서 정상적으로 동작했습니다. 데이터 증강 부분에서 `reshape(-1, 28, 28, 1)`을 추가하여 문제를 해결했습니다. 이제 이 코드를 Blogspot에 게시할 수 있습니다.

참고 자료

개선 코드


import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

# MNIST 데이터셋 로드
mnist = keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 데이터 정규화 (0~1 범위로 스케일링)
x_train, x_test = x_train / 255.0, x_test / 255.0

# 더 복잡한 모델 구성
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),  # 입력층
    keras.layers.Dense(256, activation='relu'),  # 은닉층 1 (256개의 노드)
    keras.layers.Dropout(0.3),                   # 드롭아웃 1 (30%)
    keras.layers.Dense(128, activation='relu'),  # 은닉층 2 (128개의 노드)
    keras.layers.Dropout(0.2),                   # 드롭아웃 2 (20%)
    keras.layers.Dense(10, activation='softmax') # 출력층
])

# 학습률 조정
optimizer = keras.optimizers.Adam(learning_rate=0.001)
model.compile(optimizer=optimizer,
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 배치 크기 및 에포크 수 설정
batch_size = 64
epochs = 10

# 데이터 증강 설정
datagen = ImageDataGenerator(
    rotation_range=10,  # 이미지 회전 (10도)
    width_shift_range=0.1,  # 가로 이동 (10%)
    height_shift_range=0.1,  # 세로 이동 (10%)
    zoom_range=0.1  # 확대/축소 (10%)
)

# 데이터 증강 적용
datagen.fit(x_train.reshape(-1, 28, 28, 1))

# 콜백 설정
callbacks = [
    EarlyStopping(monitor='val_loss', patience=3),  # 3회 동안 검증 손실이 개선되지 않으면 학습 중지
    ModelCheckpoint('best_model.h5', monitor='val_accuracy', save_best_only=True)  # 최고 성능 모델 저장
]

# 모델 학습
history = model.fit(datagen.flow(x_train.reshape(-1, 28, 28, 1), y_train, batch_size=batch_size),
                    epochs=epochs, validation_data=(x_test.reshape(-1, 28, 28, 1), y_test),
                    callbacks=callbacks)

# 모델 평가
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f"\nTest accuracy: {test_acc:.4f}")

20241230

Mac에서 TensorFlow와 Keras Import 오류

Mac 환경에서 TensorFlow와 Keras를 사용하다 보면 import 과정에서 다양한 오류가 발생할 수 있습니다. 이 글에서는 Mac 사용자들이 겪을 수 있는 문제와 해결 방법을 단계별로 설명합니다.

1. TensorFlow와 Keras 설치 확인

먼저, TensorFlow와 Keras가 제대로 설치되었는지 확인합니다.

# TensorFlow 설치 확인
pip show tensorflow

# Keras 설치 확인
pip show keras

만약 설치되어 있지 않다면, 다음 명령어로 설치합니다.

# TensorFlow 설치
pip install tensorflow

2. Mac에서 발생할 수 있는 Import 오류

  • Python 버전 문제: Mac에 기본적으로 설치된 Python 버전이 TensorFlow와 호환되지 않을 수 있습니다.
  • 환경 변수 문제: Mac의 환경 변수가 제대로 설정되지 않아 발생할 수 있습니다.
  • M1/M2 칩 호환 문제: Apple Silicon(M1/M2) 칩을 사용하는 경우, TensorFlow가 제대로 작동하지 않을 수 있습니다.
  • OpenSSL 문제: Mac의 OpenSSL 버전이 TensorFlow와 호환되지 않을 수 있습니다.

3. Import 오류 해결 방법

Case 1: ModuleNotFoundError: No module named 'tensorflow'

TensorFlow가 설치되지 않은 경우 발생합니다. 설치 명령어를 실행합니다.

pip install tensorflow

Case 2: ImportError: cannot import name 'keras'

TensorFlow 2.x 이후로 kerastensorflow.keras로 import해야 합니다.

# 올바른 import 방법
from tensorflow import keras

Case 3: Python 버전 문제

Mac에 기본적으로 설치된 Python 버전이 TensorFlow와 호환되지 않을 수 있습니다. Python 3.7~3.10 버전을 사용하는지 확인하세요. 만약 아니라면, Homebrew를 사용하여 Python을 재설치합니다.

# Homebrew로 Python 설치
brew install python@3.9

# 설치된 Python 버전 확인
python3 --version

Case 4: Apple Silicon(M1/M2) 칩 호환 문제

Apple Silicon(M1/M2) 칩을 사용하는 경우, TensorFlow가 제대로 작동하지 않을 수 있습니다. 다음 명령어로 Apple 전용 TensorFlow를 설치합니다.

# Apple Silicon 전용 TensorFlow 설치
pip install tensorflow-macos
pip install tensorflow-metal  # GPU 가속 지원

Case 5: OpenSSL 문제

Mac의 OpenSSL 버전이 TensorFlow와 호환되지 않을 수 있습니다. 다음 명령어로 OpenSSL을 업데이트합니다.

# Homebrew로 OpenSSL 설치
brew install openssl

# 환경 변수 설정
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"

Case 6: ImportError: dlopen(...): Library not loaded

이 오류는 필요한 라이브러리가 제대로 로드되지 않았을 때 발생합니다. 주로 OpenSSL 또는 기타 종속 라이브러리 문제로 인해 발생합니다. 다음 명령어로 문제를 해결할 수 있습니다.

# Homebrew로 필요한 라이브러리 설치
brew install openssl readline sqlite3 xz zlib

# 환경 변수 설정
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"

4. 추가 팁

  • 가상 환경 사용: 가상 환경을 사용하여 프로젝트별로 독립적인 환경을 구성하면 문제를 방지할 수 있습니다.
  • 에러 메시지 확인: 에러 메시지를 자세히 읽어보면 문제의 원인을 파악하는 데 도움이 됩니다.
  • 공식 문서 참고: TensorFlow와 Keras의 공식 문서를 참고하여 최신 정보를 확인하세요.

결론

Mac 환경에서 TensorFlow와 Keras를 사용할 때 발생하는 import 오류는 주로 Python 버전, Apple Silicon 호환성, OpenSSL 문제 등으로 인해 발생합니다. 이 글에서 소개한 방법을 따라가면서 문제를 해결해 보세요. 만약 해결되지 않는다면, 공식 문서나 커뮤니티에서 도움을 받을 수 있습니다.

참고 자료

TensorFlow와 Keras를 활용한 딥러닝 모델 개발

딥러닝은 머신러닝의 한 분야로, 복잡한 데이터를 학습하여 예측 또는 분류를 수행하는 기술입니다. TensorFlow와 Keras는 딥러닝 모델을 쉽게 구축하고 학습할 수 있도록 도와주는 강력한 도구입니다. 이 글에서는 TensorFlow와 Keras를 사용하여 간단한 딥러닝 모델을 개발하는 방법을 단계별로 설명합니다.

1. 개발 환경 설정

먼저, TensorFlow와 Keras를 설치하고 개발 환경을 설정합니다.

# TensorFlow와 Keras 설치
!pip install tensorflow

# 필요한 라이브러리 임포트
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt

2. 데이터 준비

이 예제에서는 MNIST 데이터셋을 사용합니다. MNIST는 0부터 9까지의 손글씨 숫자 이미지 데이터셋입니다.

# MNIST 데이터셋 로드
mnist = keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 데이터 정규화 (0~1 범위로 스케일링)
x_train, x_test = x_train / 255.0, x_test / 255.0

# 데이터 형태 확인
print("Train data shape:", x_train.shape)
print("Test data shape:", x_test.shape)

출력:

Train data shape: (60000, 28, 28)
Test data shape: (10000, 28, 28)

이미지 예시:

MNIST 이미지 예시

(출처: 위키미디어)

3. 모델 구성

Keras의 Sequential API를 사용하여 간단한 신경망 모델을 구성합니다.

# 모델 구성
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),  # 입력층 (28x28 이미지를 1D 배열로 변환)
    keras.layers.Dense(128, activation='relu'),  # 은닉층 (128개의 노드, ReLU 활성화 함수)
    keras.layers.Dropout(0.2),                   # 드롭아웃 (과적합 방지)
    keras.layers.Dense(10, activation='softmax') # 출력층 (10개의 노드, 소프트맥스 활성화 함수)
])

# 모델 요약 출력
model.summary()

출력:

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 flatten (Flatten)           (None, 784)               0         
 dense (Dense)               (None, 128)               100480    
 dropout (Dropout)           (None, 128)               0         
 dense_1 (Dense)             (None, 10)                1290      
=================================================================
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
_________________________________________________________________

4. 모델 학습

모델을 컴파일하고 학습 데이터를 사용하여 학습시킵니다.

# 모델 컴파일
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 모델 학습
history = model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))

출력:

Epoch 1/5
1875/1875 [==============================] - 5s 2ms/step - loss: 0.2960 - accuracy: 0.9140 - val_loss: 0.1421 - val_accuracy: 0.9576
Epoch 2/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.1430 - accuracy: 0.9578 - val_loss: 0.1005 - val_accuracy: 0.9693
...

학습 과정 시각화:

학습 과정 시각화

5. 모델 평가

테스트 데이터를 사용하여 모델의 성능을 평가합니다.

# 모델 평가
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f"\nTest accuracy: {test_acc:.4f}")

출력:

313/313 - 0s - loss: 0.0756 - accuracy: 0.9771
Test accuracy: 0.9771

6. 모델 활용

학습된 모델을 사용하여 새로운 데이터에 대한 예측을 수행합니다.

# 테스트 데이터 예측
predictions = model.predict(x_test)

# 첫 번째 테스트 데이터 예측 결과 확인
print("Predicted label:", np.argmax(predictions[0]))
print("Actual label:", y_test[0])

출력:

Predicted label: 7
Actual label: 7

7. 추가 학습 및 개선

모델의 성능을 더욱 개선하기 위해 다음과 같은 방법을 시도할 수 있습니다:

  1. 은닉층의 수와 노드 수를 조정합니다.
  2. 학습률(learning rate)을 변경합니다.
  3. 데이터 증강(data augmentation)을 적용합니다.
  4. 더 복잡한 모델(CNN, RNN 등)을 사용합니다.

결론

이 글에서는 TensorFlow와 Keras를 사용하여 간단한 딥러닝 모델을 개발하는 방법을 단계별로 설명했습니다. MNIST 데이터셋을 활용하여 모델을 구성하고 학습하며, 모델의 성능을 평가하고 예측을 수행하는 과정을 다뤘습니다. 딥러닝은 다양한 분야에서 활용될 수 있는 강력한 기술이므로, 지속적인 학습과 실습을 통해 더욱 발전시켜 보세요.

참고 자료

20241229

TensorFlow와 Keras 소개 및 활용

TensorFlow와 Keras: 딥러닝을 위한 핵심 도구

TensorFlow와 Keras는 딥러닝 개발을 위한 강력한 오픈소스 라이브러리입니다. TensorFlow는 복잡한 수치 연산을 효율적으로 수행하는 데 적합하며, Keras는 고수준 API로 사용자가 간단하게 모델을 설계하고 학습할 수 있도록 돕습니다. 이 글에서는 TensorFlow와 Keras의 주요 특징과 사용법을 살펴보겠습니다.

TensorFlow와 Keras 시작하기

TensorFlow와 Keras는 Python 기반이며, 설치 후 간단한 코드를 통해 쉽게 활용할 수 있습니다.

설치 및 버전 확인

pip install tensorflow

import tensorflow as tf
from tensorflow import keras

print("TensorFlow 버전:", tf.__version__)

MNIST 데이터셋으로 딥러닝 모델 구축

아래는 MNIST 데이터셋을 사용하여 간단한 딥러닝 모델을 구축하고 학습시키는 코드입니다.

import numpy as np
from tensorflow import keras
import tensorflow as tf

# MNIST 데이터셋 로드
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

# 모델 정의
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(10, activation='softmax')
])

# 모델 컴파일
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 모델 학습
model.fit(x_train, y_train, epochs=5)

# 모델 평가
model.evaluate(x_test, y_test)

데이터 시각화

학습 데이터를 시각화하여 모델이 처리하는 데이터를 직관적으로 이해할 수 있습니다.

import matplotlib.pyplot as plt

plt.imshow(x_train[0], cmap='gray')
plt.title(f"Label: {y_train[0]}")
plt.show()

텐서(Tensor)와 텐서플로 연산

TensorFlow의 핵심은 텐서입니다. 텐서는 다차원 배열로, 모델 학습과 데이터 처리를 위한 기본적인 데이터 구조입니다.

텐서 생성

import tensorflow as tf

# 상수 텐서
tensor_constant = tf.constant([[1, 2], [3, 4]])
print("상수 텐서:", tensor_constant)

# 변수 텐서
tensor_variable = tf.Variable([[1, 2], [3, 4]])
print("변수 텐서:", tensor_variable)

# 랜덤 텐서
tensor_random = tf.random.normal([2, 2], mean=0, stddev=1.0)
print("랜덤 텐서:", tensor_random)

텐서 연산

TensorFlow는 다양한 수학 연산을 지원합니다.

# 행렬 곱
a = tf.constant([[1, 2], [3, 4]])
b = tf.constant([[5, 6], [7, 8]])
result = tf.matmul(a, b)
print("행렬 곱 결과:", result)

# 텐서 브로드캐스팅
c = tf.constant([1, 2, 3])
d = tf.constant([[1], [2], [3]])
broadcasted_result = c + d
print("브로드캐스팅 결과:", broadcasted_result)

Keras를 활용한 심화 작업

사용자 이미지로 테스트

사용자 이미지를 학습된 모델에 입력하여 모델 성능을 테스트할 수 있습니다. 예를 들어, 손으로 작성한 숫자를 이미지로 저장하고 이를 입력 데이터로 사용합니다.

from PIL import Image
import numpy as np

# 이미지 불러오기
image = Image.open("handwritten_digit.png").convert("L")
image = image.resize((28, 28))
image = np.array(image) / 255.0

# 차원 추가 및 예측
image = np.expand_dims(image, axis=0)
prediction = model.predict(image)
print("예측된 클래스:", np.argmax(prediction))

TensorFlow와 Keras의 장점

  • 직관적인 API: 초보자부터 전문가까지 쉽게 사용할 수 있도록 설계되었습니다.
  • 다양한 플랫폼 지원: CPU, GPU, TPU 등 다양한 하드웨어에서 실행 가능합니다.
  • 확장성: 복잡한 모델부터 간단한 실험까지 모두 처리할 수 있는 유연한 구조를 제공합니다.

TensorFlow

TensorFlow: 딥러닝과 기계 학습의 시작

작성자: DevInsights

TensorFlow는 구글이 개발한 강력한 오픈소스 라이브러리로, 딥러닝과 기계 학습의 필수 도구로 자리 잡았습니다. 이 글에서는 TensorFlow의 기본 개념과 설치 방법, 주요 개념을 간단히 살펴보겠습니다.

TensorFlow란?

TensorFlow는 기계 학습 및 딥러닝 모델을 설계, 학습, 배포하는 데 사용되는 라이브러리입니다. 복잡한 수치 연산을 지원하는 그래프 기반의 계산 구조로 효율적인 대규모 데이터 처리와 신경망 학습을 제공합니다.

  • 다양한 API: 고수준 Keras API를 포함하여 사용자 친화적인 개발 환경 제공
  • 유연한 구조: CPU, GPU, TPU 등 다양한 하드웨어 환경 지원
  • 자동 미분 기능: 그래디언트 계산 및 역전파 구현을 지원
  • 모델 배포: 학습된 모델을 효율적으로 배포 및 추론

TensorFlow 설치

TensorFlow는 pip 또는 Docker를 통해 설치할 수 있습니다. 여기서는 pip로 설치하는 방법을 안내합니다.

  1. pip 업그레이드:
    pip install --upgrade pip
    오류가 발생할 경우 다음 명령어를 사용합니다:
    C:\anaconda3\python.exe -m pip install --upgrade pip
  2. TensorFlow 설치:
    pip install --upgrade tensorflow (CPU 및 GPU 지원)
    pip install --upgrade tensorflow-cpu (CPU 전용)
  3. 설치 확인:
    아래 코드를 실행하여 TensorFlow 설치 상태와 GPU 지원 여부를 확인합니다:
    import tensorflow as tf
    print(tf.__version__)
    print('GPU 사용 가능' if tf.test.is_gpu_available() else 'GPU 사용 불가능')
    print(tf.config.list_physical_devices('GPU'))
                        

텐서(Tensor) 이해하기

텐서는 다차원 배열로, 딥러닝 모델에서 데이터의 기본 단위로 사용됩니다. 차원(axis)은 텐서의 구조를 나타내며, 차원의 수는 랭크(rank)로 표현됩니다.

  • 0차원: 스칼라 (하나의 숫자)
  • 1차원: 벡터 (숫자의 나열)
  • 2차원: 행렬 (행과 열)
  • 3차원 이상: 이미지, 영상 등 복잡한 데이터 표현

아래는 텐서 생성 및 사용 예제입니다:

import tensorflow as tf

# 0차원 텐서
scalar_tensor = tf.constant(5)
print(scalar_tensor)

# 1차원 텐서
vector_tensor = tf.constant([1, 2, 3])
print(vector_tensor)

# 2차원 텐서
matrix_tensor = tf.constant([[1, 2], [3, 4]])
print(matrix_tensor)
            

상수 텐서와 변수 텐서

TensorFlow는 tf.constant()tf.Variable()을 통해 상수와 변수를 생성합니다. 상수는 불변이며, 변수는 값이 변경 가능합니다.

# 상수 텐서
constant_tensor = tf.constant([1, 2, 3])

# 변수 텐서
variable_tensor = tf.Variable([1, 2, 3])
            

주요 함수와 활용

TensorFlow에서 자주 사용되는 주요 함수:

  • tf.add(), tf.subtract(), tf.multiply(), tf.divide(): 기본 연산
  • tf.zeros(), tf.ones(): 초기화 함수
  • tf.random.normal(): 랜덤 초기화
  • tf.nn.relu(), tf.nn.sigmoid(): 활성화 함수
  • tf.reduce_mean(), tf.reduce_sum(): 통계 연산
  • tf.keras.layers: 모델 구성
  • tf.GradientTape(): 자동 미분

이 함수들을 조합하여 복잡한 딥러닝 모델을 설계하고 학습시킬 수 있습니다.

20241228

Vite에서 Path Alias 설정

코드 리뷰 중 상대 경로가 너무 복잡해지는 문제가 발생했습니다. 
../../../components/...와 형태의 경로를 계속 사용하는 것은 가독성과 유지보수 등 좋지 않아 Vite에서 Path Alias를 설정하는 방법으로 수정했습니다.

1. TypeScript에서 Path Alias 설정

먼저, tsconfig.json 파일을 통해 Path Alias를 설정할 수 있습니다. 설정 예시는 다음과 같습니다:

{
  "compilerOptions": {
    "baseUrl": "src",
    "paths": {
      "@/*": ["*"],
      "@components/*": ["components/*"]
    }
  },
  "include": ["src"]
}
    

위와 같이 설정하면 src 디렉토리를 기준으로 상대 경로를 별칭으로 대체할 수 있습니다. 예를 들어, import Something from "../../../components/Something"import Something from "@components/Something"로 간단히 바꿀 수 있습니다.

참고: TypeScript 컴파일러는 이 설정만으로 동작하지만, Vite 빌드 시스템에서는 추가 설정이 필요합니다.

2. Vite에서 Path Alias 설정

Vite는 자체적으로 Path Alias를 지원합니다. 하지만 TypeScript 설정만으로는 동작하지 않으므로 별도의 vite.config.js 파일에서 추가 설정을 해야 합니다:

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react-swc";
import path from "path";

export default defineConfig({
  plugins: [react()],
  resolve: {
    alias: [
      { find: "@", replacement: path.resolve(__dirname, "src") },
      { find: "@components", replacement: path.resolve(__dirname, "src/components") }
    ]
  }
});
    

find는 별칭, replacement는 해당 별칭의 절대 경로를 지정합니다. TypeScript의 tsconfig.jsonpaths와 동일한 별칭을 사용해야 일관성을 유지할 수 있습니다.

팁: Alias 설정을 사용할 때, 프로젝트 구조가 변경되면 설정도 업데이트해야 합니다. 유지보수를 쉽게 하려면 디렉토리 구조를 안정적으로 유지하는 것이 중요합니다.

실행 중 발생할 수 있는 문제

설정 후 아래와 같은 에러가 발생할 수 있습니다:

[vite] Internal server error: Failed to resolve import "@components/common" 
from "src/Router.tsx". Does the file exist?
    

이는 Vite가 TypeScript 설정만으로는 별칭을 해석하지 못하기 때문에 발생하는 문제입니다. 위에서 설명한 vite.config.js 설정을 적용하면 해결됩니다.

3. vite-tsconfig-paths 플러그인 사용

위 방식 대신, 더 간단하게 vite-tsconfig-paths 플러그인을 사용할 수도 있습니다. 이 플러그인은 tsconfig.json에 정의된 paths를 자동으로 Vite에 적용해 줍니다.

설정 방법

  1. npm install -D vite-tsconfig-paths로 플러그인을 설치합니다.
  2. 다음과 같이 Vite 설정 파일에 플러그인을 추가합니다:
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react-swc";
import tsconfigPaths from "vite-tsconfig-paths";

export default defineConfig({
  plugins: [react(), tsconfigPaths()]
});
    

위 방법은 설정이 간단하고 유지보수가 쉬워 추천하는 방식입니다.

4. 추가 고려 사항

Path Alias 설정 시, 아래 사항들을 고려하면 더 효율적인 프로젝트 구성이 가능합니다:

  • 테스트 환경에서도 Alias가 동작하도록 jest.config.js에 별도로 설정 필요
  • ESLint를 사용하는 경우 .eslintrc에 Alias를 매핑
  • Webpack과 같은 다른 빌드 도구를 사용하는 경우 Alias 일치 여부 확인

특히, 다양한 도구를 사용하는 프로젝트에서는 Alias 설정이 통일되지 않으면 디버깅이 어려워질 수 있습니다.

마무리

이번 글에서는 Vite에서 Path Alias를 설정하는 방법과 관련된 다양한 기술 사항을 정리했습니다:

  1. TypeScript의 tsconfig.json 설정
  2. Vite의 vite.config.js에서 직접 설정
  3. vite-tsconfig-paths 플러그인 활용


 

VS Code에서 Prettier 설정

들어가며

코드 작성 시 일관된 스타일을 유지하는 것은 가독성과 협업에서 매우 중요합니다. 이를 도와주는 도구로 Prettier가 널리 사용됩니다. 특히, VS Code와 결합하면 자동으로 포맷팅을 적용하여 개발 시간을 절약할 수 있습니다. 이번 글에서는 VS Code에서 Prettier를 설치하고 설정하는 과정을 소개합니다.

Prettier란?

Prettier는 JavaScript, TypeScript, HTML, CSS 등 다양한 언어를 지원하는 코드 포맷터입니다. 팀원 간의 코드 스타일 충돌을 방지하며, 설정한 규칙에 따라 자동으로 코드 스타일을 맞춰주는 것이 특징입니다. 이를 통해 개발자는 코드 작성에만 집중할 수 있습니다.

VS Code에서 Prettier 설정하기

1. Prettier 확장 프로그램 설치

  1. VS Code의 사이드바에서 Extensions 아이콘을 클릭합니다.
  2. 검색창에 "Prettier - Code formatter"를 입력하고, Prettier 확장을 설치합니다.

설치가 완료되면, Prettier가 활성화된 상태로 코드 포맷팅을 적용할 준비가 됩니다.

2. 기본 포맷터로 Prettier 설정

VS Code의 기본 포맷터로 Prettier를 설정하려면 아래 단계를 따르세요:

  1. 파일환경 설정설정으로 이동합니다.
  2. 검색창에 "default formatter"를 입력합니다.
  3. Editor: Default FormatterPrettier로 선택합니다.

3. 저장 시 포맷팅 설정

코드를 저장할 때 자동으로 포맷팅되도록 설정하려면 다음 단계를 따르세요:

  1. 설정 파일(settings.json)을 엽니다.
  2. 다음 내용을 추가합니다:
{
    "editor.formatOnSave": true
}
        

이제 코드를 저장할 때마다 Prettier가 자동으로 코드 스타일을 정리합니다.

추가 설정: Prettier 규칙 변경하기

Prettier는 기본적으로 표준 스타일을 따르지만, 팀의 요구에 따라 설정을 변경할 수 있습니다. 설정 파일(.prettierrc)을 생성한 후, 아래와 같이 규칙을 정의할 수 있습니다:

{
    "semi": false,
    "singleQuote": true,
    "tabWidth": 2
}
        

위 설정은 다음과 같은 규칙을 적용합니다:

  • semi: 세미콜론 생략
  • singleQuote: 작은따옴표 사용
  • tabWidth: 들여쓰기 너비 2칸

문제 해결

설정 후 Prettier가 작동하지 않을 경우, 다음을 확인하세요:

  • Prettier 확장이 제대로 설치되었는지
  • 저장 시 포맷팅 옵션이 활성화되었는지
  • 작업 중인 파일이 Prettier가 지원하는 언어인지

이 외에도 Prettier가 프로젝트별로 다른 설정을 적용하도록 eslint와 함께 사용할 수도 있습니다.

Prettier 옵션

{
  "arrowParens": "always", // 화살표 함수의 매개변수가 하나일 때 괄호를 사용할지 여부
  "bracketSpacing": true, // 객체 리터럴에서 중괄호 내부에 공백 삽입 여부
  "endOfLine": "auto", // EoF 방식, OS별로 처리 방식이 다름
  "htmlWhitespaceSensitivity": "css", // HTML 공백 감도 설정
  "jsxBracketSameLine": false, // JSX의 마지막 `>`를 다음 줄로 내릴지 여부
  "jsxSingleQuote": false, // JSX에서 single quote 사용 여부
  "printWidth": 80, // 한 줄에 출력되는 코드의 최대 길이
  "proseWrap": "preserve", // markdown 텍스트의 줄바꿈 방식
  "quoteProps": "as-needed", // 객체 속성에 쿼테이션 적용 방식
  "semi": true, // 세미콜론 사용 여부
  "singleQuote": true, // single quote 사용 여부
  "tabWidth": 2, // 탭 간격
  "trailingComma": "all", // 여러 줄을 사용할 때 후행 콤마 사용 방식
  "useTabs": false, // 탭 사용 여부
  "vueIndentScriptAndStyle": true, // Vue 파일의 script와 style 태그의 들여쓰기 여부
  "parser": '', // 사용할 parser 지정 (자동으로 지정됨)
  "filepath": '', // parser를 유추할 수 있는 파일 경로 지정
  "rangeStart": 0, // 포맷팅을 적용할 파일의 시작 지점
  "rangeEnd": Infinity, // 포맷팅을 적용할 파일의 끝 지점
  "requirePragma": false, // 파일 상단에 정의된 주석을 기반으로 포맷팅 사용 여부
  "insertPragma": false, // 미리 정의된 @format 주석 추가 여부
  "overrides": [ 
    {
      "files": "*.json",
      "options": {
        "printWidth": 200
      }
    }
  ] // 특정 파일별로 옵션을 다르게 설정
}
    

옵션 상세 설명

옵션 설명
arrowParens 화살표 함수의 매개변수가 하나일 때 괄호 사용 여부 ("always" 또는 "avoid")
bracketSpacing 객체 리터럴에서 중괄호 내부 공백 삽입 여부
endOfLine 파일 끝 라인 형식 ("lf", "crlf", "cr", "auto")
jsxSingleQuote JSX에서 single quote 사용 여부
printWidth 한 줄에 출력되는 코드의 최대 길이
semi 세미콜론 사용 여부
singleQuote single quote 사용 여부
tabWidth 탭 간격 (기본값: 2)
trailingComma 후행 콤마 사용 방식 ("none", "es5", "all")

20241227

Vue.js에서 vue-qrcode-reader를 사용하여 QR 코드 스캔 통합

이 글에서는 `vue-qrcode-reader` 라이브러리를 사용하여 Vue.js 애플리케이션에 QR 코드 및 바코드를 스캔하는 방법을 설명합니다.

개요

`vue-qrcode-reader` 라이브러리는 Vue.js 프로젝트에서 QR 코드 및 다른 바코드 형식을 브라우저에서 직접 감지할 수 있는 간편한 컴포넌트를 제공합니다. 이 라이브러리는 카메라 스트림에서 스캔, 드래그 앤 드롭 이미지 업로드, 파일 업로드 등의 여러 가지 모드를 지원합니다.

제공되는 컴포넌트

  • QrcodeStream: 카메라 스트림에서 연속적으로 프레임을 스캔합니다.
  • QrcodeDropZone: 사용자가 이미지를 드래그 앤 드롭하여 즉시 디코딩할 수 있는 영역입니다.
  • QrcodeCapture: 사용자가 선택한 파일을 스캔하는 전통적인 파일 업로드 필드입니다.

이 패키지는 최소한의 스타일링으로 기능에 집중하고 있어 기존 레이아웃에 쉽게 통합할 수 있습니다.

주요 기능

  • 반응형 디자인: 기본적으로 모바일 반응형 디자인을 지원합니다.
  • 카메라 통합: `QrcodeStream` 컴포넌트를 통해 웹캠 또는 모바일 장치의 카메라를 사용해 연속적으로 QR 코드를 스캔할 수 있습니다.
  • 드래그 앤 드롭 지원: `QrcodeDropZone`을 사용하여 이미지를 드래그 앤 드롭해 QR 코드를 즉시 스캔할 수 있습니다.
  • 파일 업로드 스캔: `QrcodeCapture` 컴포넌트를 통해 사용자가 선택한 파일을 스캔할 수 있습니다.

설치

npm으로 설치:

npm install vue-qrcode-reader

설치 후, 다음과 같이 필요한 컴포넌트를 개별적으로 가져올 수 있습니다:

import { QrcodeStream, QrcodeDropZone, QrcodeCapture } from 'vue-qrcode-reader'

또는, 모든 컴포넌트를 전역적으로 등록할 수 있습니다:

import Vue from 'vue'
import VueQrcodeReader from 'vue-qrcode-reader'

Vue.use(VueQrcodeReader)

npm 없이 사용하기:

다음과 같은 스크립트 태그를 포함하세요:

<script src="https://unpkg.com/vue-qrcode-reader/dist/vue-qrcode-reader.umd.js"></script>

이 스크립트는 Vue.js 스크립트 뒤에 포함되어야 합니다.

사용법

패키지를 설정한 후, 컴포넌트를 사용하는 것은 간단합니다. 아래는 QrcodeStream 컴포넌트를 사용하여 QR 코드를 스캔하는 예제입니다:

<template>
  <qrcode-stream @detect="onDetect"></qrcode-stream>
</template>

<script>
export default {
  methods: {
    onDetect(detectedCodes) {
      console.log(detectedCodes)  // 감지된 QR 코드 처리
    }
  }
}
</script>

@detect 이벤트는 디코딩된 QR 코드 데이터를 반환하므로 이를 애플리케이션에서 필요에 맞게 처리할 수 있습니다.

문제 해결

QrcodeStream에서 카메라가 표시되지 않음

HTTPS에서 실행 중인지 확인하고, 카메라 스트림을 사용할 수 있는 권한이 있는지 확인해 주세요. 또한 웹캠이 지원되는지 확인해야 합니다.

스캔할 QR 코드가 감지되지 않음

QR 코드 주위에 충분한 여백이 있는지 확인하십시오. 또한 QR 코드가 깨끗하고 잘 인식되는지 확인해야 합니다.

ESLint 및 Prettier 줄바꿈 오류 해결 방안

ESLint 및 Prettier 줄바꿈 오류 해결 방안

문제 발생 상황

환경:

  • 운영 체제는 Windows입니다.
  • VSCode를 사용하여 프로젝트를 개발하고 있습니다.
  • 프로젝트는 Mac 사용자가 생성했으며, Mac/Linux 환경의 기본 줄바꿈 방식인 LF를 사용하고 있습니다.
  • ESLint와 Prettier가 설정된 프로젝트입니다.

프로젝트 ESLint 설정:

  • ESLint는 plugin:prettier/recommended를 통해 Prettier 규칙을 ESLint 규칙으로 통합하고 있습니다.
  • Prettier 규칙 위반 시 ESLint가 오류로 보고하도록 설정되어 있습니다.
  • Prettier는 기본적으로 줄바꿈 방식을 Unix 스타일(LF)로 강제하고 있습니다.

문제 증상

pnpm i 실행 후 ESLint 및 Prettier에서 다음과 같은 오류가 발생하였습니다:

  • [eslint] prettier/prettier: Delete

Prettier가 줄바꿈 방식으로 LF를 요구했으나, Windows 환경에서 파일이 CRLF로 변환된 것이 원인으로 보입니다.

문제 원인

운영 체제 별 줄바꿈 차이:

  • Mac 사용자는 기본적으로 LF 줄바꿈 방식을 사용하지만, Windows에서는 Git의 core.autocrlf 설정에 따라 파일을 CRLF로 변환합니다.
  • Prettier는 줄바꿈 방식을 엄격히 검사하며, CRLF를 허용하지 않고 LF를 요구합니다.

Git의 줄바꿈 변환:

  • Windows의 기본 설정인 core.autocrlf=true로 인해 파일을 Git 저장소에서 내 컴퓨터의 작업 디렉토리로 가져오면 CRLF로 변환됩니다.

Prettier와 ESLint 규칙의 엄격성:

  • Prettier는 줄바꿈 방식의 일관성을 유지하도록 강제하며, ESLint는 Prettier 규칙 위반을 오류로 보고합니다.

해결 방법

1. Git 전역 설정 변경

리모트 레포지토리를 로컬로 클론할 때, 줄바꿈 방식을 LF로 고정하여 CRLF로 변환되는 문제를 방지합니다.

git config --global core.autocrlf false
git config --global core.eol lf
  • git config --global core.autocrlf false: Git이 줄바꿈을 자동 변환하지 않도록 설정합니다.
  • git config --global core.eol lf: 파일을 항상 LF 줄바꿈 방식으로 저장하도록 강제합니다.

2. ESLint와 Prettier 설정 고정을 통한 문제 해결

ESLint와 Prettier 설정을 고정하여 줄바꿈 방식을 강제하는 방법입니다.

Prettier 설정 추가

{
  "endOfLine": "lf"
}

ESLint 규칙 추가

{
  "extends": ["plugin:prettier/recommended"],
  "rules": {
    "prettier/prettier": [
      "error",
      {
        "endOfLine": "lf"
      }
    ]
  }
}

주의: endOfLine: "auto"는 줄바꿈 방식을 강제하지 않으므로, LF와 CRLF 두 방식 모두 허용합니다.

3. 프로젝트 VSCode 설정

Windows 개발자의 편의를 위해 VSCode에서 파일 생성 시 자동으로 LF 방식으로 생성되도록 설정합니다.

{
  "files.eol": "\n",
  "editor.formatOnSave": true
}
  • files.eol: "\n": 새로 생성되는 모든 파일의 줄바꿈 방식을 LF로 강제합니다.
  • editor.formatOnSave: true: 저장 시 Prettier 등의 포매터를 자동 실행하여 줄바꿈 방식을 다시 정리합니다.

VSCode에서 수동으로 줄바꿈 방식을 변경하는 방법

VSCode에서 하단 상태 바에 있는 LF 또는 CRLF를 클릭하면 줄바꿈 방식을 선택할 수 있는 옵션이 나타납니다. 하지만, 이 방법은 현재 파일에만 적용되므로, 앞으로 생성되는 모든 파일에 일관된 줄바꿈 방식을 사용하려면 위에서 설명한 방법처럼 설정에서 기본값을 변경하는 것이 좋습니다.

결론

위 해결 방법을 통해 운영 체제 간의 줄바꿈 방식 차이로 인해 발생하는 문제를 완벽히 해결할 수 있습니다. 이 방법을 프로젝트 초기 설정에 포함시키면, 줄바꿈 문제로 인한 불필요한 시간 낭비를 방지하고, 모든 팀원이 동일한 환경에서 작업할 수 있는 기반을 마련할 수 있습니다.

Laravel 404 error

Laravel 404 오류 해결 방법

Laravel로 개발을 진행하다 보면 라우트 설정이 올바른 것처럼 보이는데도 404 오류가 발생할 수 있습니다. 이 글에서는 404 오류의 주요 원인과 이를 해결하는 방법을 안내드립니다.


1. 컨트롤러와 메소드 이름 확인

404 오류의 가장 흔한 원인은 라우트 설정에서 컨트롤러 이름이나 메소드 이름이 잘못 작성된 경우입니다. 다음 사항을 점검해 보세요:

  • web.phpapi.php 파일에서 라우트에 연결된 컨트롤러와 메소드 이름이 정확히 작성되었는지 확인합니다.
  • 예를 들어, 라우트 설정에서 Route::get('/posts', [PostController::class, 'index']);라고 작성되었다면, PostController 클래스와 해당 클래스 안의 index 메소드가 존재하는지 확인해야 합니다.

2. 라우트 캐시 삭제

컨트롤러와 메소드가 정확한데도 문제가 지속된다면, 라우트 캐시로 인해 발생한 문제일 가능성이 있습니다. Laravel은 성능 향상을 위해 라우트를 캐싱하며, 이 캐시가 꼬이면 최신 라우트 정보가 반영되지 않을 수 있습니다. 다음 명령어를 실행하여 라우트 캐시를 삭제해 보세요:

php artisan route:clear

3. 다른 캐시도 초기화

라우트 캐시만 삭제하는 것으로 해결되지 않을 경우, Laravel에서 사용하는 다른 캐시들도 초기화해 보시기 바랍니다. 다음은 주요 캐시를 삭제하는 명령어입니다:

3.1 애플리케이션 캐시 삭제

애플리케이션 캐시를 초기화하려면 아래 명령어를 실행합니다:

php artisan cache:clear

3.2 설정 파일 캐시 삭제

Laravel은 설정 파일들을 캐싱하여 성능을 높입니다. 하지만 이 캐시가 문제가 될 경우 아래 명령어를 사용해 캐시를 삭제해 보세요:

php artisan config:clear

3.3 뷰 파일 캐시 삭제

Blade 템플릿 사용 시, 뷰 파일 캐시가 꼬이면 변경 사항이 반영되지 않을 수 있습니다. 아래 명령어를 실행해 뷰 캐시를 삭제해 보세요:

php artisan view:clear

4. 추가 점검 사항

위 방법으로 해결되지 않을 경우, 아래 사항도 점검해 보시기 바랍니다:

  • Laravel의 버전이 오래되었을 경우 최신 버전으로 업그레이드해 보세요.
  • .env 파일의 설정이 올바르게 구성되었는지 확인합니다. 예를 들어, APP_URL이나 APP_ENV 설정이 잘못되면 문제가 발생할 수 있습니다.
  • 서버 환경(Nginx, Apache 등)의 설정을 점검하여 URL Rewrite 설정이 제대로 적용되었는지 확인합니다.

마무리

위에서 안내드린 방법들을 순서대로 적용하면 대부분의 404 오류를 해결하실 수 있습니다. 개발 환경에서는 캐시 문제로 인해 오류가 발생하는 경우가 많으니, 주기적으로 캐시를 삭제하며 작업하시길 권장드립니다.

Python + Django + 복수 Mysql

Django에서 DB와 DB Router 설정하기

Django에서는 다중 데이터베이스를 사용할 때 DB Router를 통해 특정 모델이 어느 데이터베이스를 사용할지 정의할 수 있습니다. 이 글에서는 settings.py에서 DB Router를 설정하고, 다중 데이터베이스를 활용하는 방법을 단계별로 설명합니다.


1. settings.py에 DB Router 및 추가 DB 설정

우선, 기본 데이터베이스 외에 추가로 연결할 데이터베이스를 정의하고, DB Router를 설정합니다.

# settings.py

# DB Router 설정
DATABASE_ROUTERS = [ 
    'core.dbrouter.MultiDBRouter', 
]

# 데이터베이스 설정
DATABASES = {
    # 기본 MySQL 데이터베이스
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'testdjango',
        'USER': 'root',
        'HOST': 'localhost',
        'PORT': '3306',
    },
    # 추가로 연결할 MySQL 데이터베이스
    'referencedb1': { 
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'DB명', 
        'USER': '계정 이름', 
        'PASSWORD': '계정 비밀번호', 
        'HOST': 'DB 주소', 
        'PORT': '포트 번호', 
    },
}

2. DB 연결 및 마이그레이션

아래 명령어를 통해 데이터베이스와 연결하고, 마이그레이션을 수행합니다.

기본 데이터베이스 마이그레이션

$ python3 manage.py makemigrations polls
$ python3 manage.py migrate

추가 데이터베이스(referencedb1) 마이그레이션

$ python3 manage.py makemigrations --database referencedb1
$ python3 manage.py migrate --database referencedb1

추가 데이터베이스의 모델 생성

추가 데이터베이스에서 테이블 정보를 자동으로 모델로 생성하려면 아래 명령어를 실행합니다.

$ python3 manage.py inspectdb --database referencedb1

3. DB Router 작성

DB Router는 모델과 데이터베이스 간의 매핑을 정의합니다. Django 앱 폴더에 dbrouter.py 파일을 생성하여 다음과 같이 작성합니다.

# core/dbrouter.py

class MultiDBRouter(object):  
    def __init__(self): 
        # 사용할 데이터베이스 이름 정의
        self.model_list = ['default', 'referencedb1']  

    def db_for_read(self, model, **hints):  
        if model._meta.app_label in self.model_list: 
            return model._meta.app_label
        return None  
    
    def db_for_write(self, model, **hints):  
        return None  
    
    def allow_relation(self, obj1, obj2, **hints):  
        return None  
    
    def allow_migrate(self, db, app_label, model_name=None, **hints):  
        return None

4. 모델 작성 시 Meta 클래스에 app_label 추가

추가 데이터베이스와 연결된 모델은 Meta 클래스에 app_label을 지정해야 합니다. 또한 managed = False를 설정하여 Django가 해당 테이블을 관리하지 않도록 합니다.

# models.py

from django.db import models 

class db1_modelname1(models.Model):
    ...
    class Meta: 
        managed = False 
        app_label = "default" 
        db_table = 'test1'  

class db2_modelname1(models.Model):
    ...
    class Meta: 
        managed = False 
        app_label = "referencedb1" 
        db_table = 'test2'

참고 자료

더 자세한 내용은 아래 링크를 참고하세요:

Python + Django + Mysql 연결

Django에서 MySQL 데이터베이스 설정하기

Django 프로젝트에서 MySQL 데이터베이스를 사용하려면, MySQL 커넥터를 설치하고 settings.py 파일에서 데이터베이스 설정을 변경해야 합니다. 이 글에서는 Django에서 MySQL을 설정하고 데이터베이스를 연결하는 방법을 설명합니다.

1. MySQL 커넥터 설치

Python에서 MySQL 서버와 통신할 수 있도록 MySQL 커넥터를 설치해야 합니다. 아래 명령어를 사용하여 설치합니다:

$ pip3 install mysqlclient

2. Django 데이터베이스 설정

Django 프로젝트의 설정 파일인 mysite/settings.py를 열어보면, 기본적으로 SQLite가 설정되어 있습니다. 이를 MySQL로 변경하려면, DATABASES 설정을 아래와 같이 수정합니다:

# mysite/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'testdjango',  # 데이터베이스 이름
        'USER': 'root',         # MySQL 사용자 이름
        'HOST': 'localhost',    # MySQL 서버 주소
        'PORT': '3306',         # MySQL 포트 번호
    }
}

3. TIMEZONE 설정

한국 시간대를 사용하려면, LANGUAGE_CODETIME_ZONE을 다음과 같이 설정합니다:

# mysite/settings.py
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
USE_I18N = True
USE_TZ = False  # DB에 TIME_ZONE을 반영하려면 False로 설정

4. 데이터베이스 체크 및 모델 생성

MySQL 데이터베이스에 있는 테이블을 자동으로 Django 모델로 생성하려면, 아래 명령어를 실행하여 해당 DB에 있는 테이블을 확인하고, 이를 Django 모델로 변환합니다:

$ python3 manage.py inspectdb

위 명령어를 실행하면, MySQL에 존재하는 테이블들을 모델로 변환하여 출력합니다. 예를 들어, Test1 테이블이 있다면 아래와 같은 모델이 생성됩니다:

from django.db import models

class Test1(models.Model):
    name = models.CharField(max_length=20, blank=True, null=True)
    id = models.CharField(primary_key=True, max_length=20)
    age = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'test1'

생성된 모델을 polls/models.py에 복사하여 붙여넣습니다.

5. 모델 활성화

모델을 프로젝트에서 활성화하려면, polls 앱을 프로젝트에 추가해야 합니다. polls/apps.py에 존재하는 클래스를 INSTALLED_APPS에 추가합니다:

# mysite/settings.py
INSTALLED_APPS = [
    'polls.apps.PollsConfig',  # polls 앱 추가
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

6. 모델 뷰와 URL 설정

모델을 뷰에서 사용할 수 있도록 polls/views.py에 모델을 불러오는 코드를 추가하고, polls/urls.py에 URL을 설정합니다:

# polls/views.py
from .models import Test1

def test_view(request):
    items = Test1.objects.all()  # Test1 테이블의 모든 객체를 불러오기
    return render(request, 'index.html', {"items": items})

# polls/urls.py
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('items/', views.test_view),  # /items URL 추가
]

7. 결과 확인

웹 브라우저에서 http://127.0.0.1:8000/polls/items/에 접속하여 DB에서 가져온 데이터를 확인할 수 있습니다.

Python Django 설치

Django 설치 및 가상환경 설정

Django는 Python으로 작성된 웹 프레임워크로, 웹 애플리케이션을 빠르게 개발할 수 있도록 도와줍니다. 이 글에서는 Django를 설치하고, 프로젝트별로 독립된 가상환경을 설정하는 방법을 설명합니다.


1. Django 설치

먼저, Python 3을 설치합니다. macOS에서는 아래 명령어를 통해 Homebrew로 설치할 수 있습니다:

$ brew install python3

2. 가상환경 구축

Python에서는 가상환경을 사용하여 프로젝트별로 독립된 환경을 만들 수 있습니다. 이를 통해 파이썬 라이브러리들이 충돌을 일으키는 것을 방지할 수 있습니다. 가상환경을 사용하면 프로젝트마다 필요한 라이브러리 버전을 구분하여 설치할 수 있습니다.

가상환경 설정 단계

1. **Django 프로젝트 디렉토리 생성**

$ mkdir workspaces
$ cd workspaces

2. **가상환경 생성**

workspaces $ python3 -m venv venvproject

3. **가상환경 활성화**

venvproject $ source bin/activate

4. **가상환경 종료**

venvproject $ deactivate

3. Django 설치

가상환경을 활성화한 후, Django를 설치합니다. 아래 명령어를 통해 Django를 설치합니다:

venvproject $ cd ..
workspaces  $ pip3 install django

설치가 완료되면, Django가 제대로 설치되었는지 버전을 확인합니다:

$ python3 -m django --version
4.1.7

4. Django 프로젝트 생성하기

Django 프로젝트를 생성하려면 django-admin startproject 명령어를 사용합니다:

$ django-admin startproject project01
$ cd project01

프로젝트가 생성되면, 서버를 구동하여 프로젝트가 잘 동작하는지 확인할 수 있습니다:

$ python3 manage.py runserver

서버가 구동되면, 브라우저에서 http://127.0.0.1:8000/로 접속하여 확인할 수 있습니다.

서버 포트나 IP 변경 시

서버의 포트나 IP를 변경하고 싶다면, 서버 구동 시에 파라미터로 전달할 수 있습니다:

$ python3 manage.py runserver 8000
$ python3 manage.py runserver 0.0.0.0:8000

위 명령어를 통해 Django 프로젝트 서버가 구동되면, 웹 브라우저에서 http://127.0.0.1:8000/에 접속하여 확인할 수 있습니다.

Laravel + VSCode

Laravel이란?

Laravel은 PHP의 인기 있는 프레임워크로, 웹 애플리케이션 개발을 효율적으로 도와줍니다. Laravel은 코드의 재사용성을 높이고, 개발자가 복잡한 작업을 더 쉽게 처리할 수 있도록 다양한 기능을 제공합니다.

Laravel 설치 및 서버 실행

Laravel을 설치하기 위해서는 Composer가 필요합니다. Composer는 PHP 소프트웨어와 라이브러리의 의존성을 관리하는 패키지 관리자입니다. 이를 통해 필요한 확장 기능을 쉽게 설치하고 관리할 수 있습니다.

1. Composer 설치

Composer를 설치하려면 Composer 공식 웹사이트에서 다운로드하고 설치를 진행합니다.

  1. "Getting Started"를 클릭합니다.
  2. "Setup" 파일을 다운로드하여 Composer를 설치합니다.
  3. 설치 후, 아래 명령어를 통해 Composer가 제대로 설치되었는지 확인할 수 있습니다:
    composer --version

2. Laravel 프로젝트 설치

Laravel을 설치하고 새로운 프로젝트를 생성하려면, 프로젝트를 배치할 폴더로 이동한 후 아래 명령어를 실행합니다:

composer create-project --prefer-dist laravel/laravel 프로젝트명

위 명령어를 실행하면, Laravel 프로젝트가 생성됩니다.

3. 서버 실행

Laravel 프로젝트 폴더로 이동하여 아래 명령어로 서버를 실행합니다:

php artisan serve

서버를 종료하려면 Ctrl + C를 눌러 서버를 중지할 수 있습니다.

4. 웹 브라우저에서 확인

웹 브라우저에서 localhost:8000을 입력하여 Laravel 서버가 정상적으로 실행되는지 확인합니다.

VSCode 세팅

Laravel 프로젝트를 VSCode에서 쉽게 작업하려면, Laravel 관련 익스텐션을 추가하는 것이 좋습니다.

추천 익스텐션 목록:

  • Laravel Artisan: Artisan 명령어를 쉽게 실행할 수 있게 도와주는 익스텐션.
  • Laravel Blade Snippets: Blade 템플릿 코드 자동 완성을 도와주는 익스텐션.
  • Laravel Blade Spacer: Blade 코드 인식 기능을 추가하는 익스텐션.
  • Laravel Go to View: view('welcome')와 같은 코드에서 해당 뷰 파일로 바로 이동할 수 있게 도와주는 익스텐션.
  • Laravel Snippet: Laravel 코드 자동 완성 기능을 제공하는 익스텐션.
  • Live Sass Compiler: SCSS 파일을 저장하면 자동으로 컴파일을 해주는 익스텐션.
  • PHP IntelliSense: PHP 코드 자동 완성과 정의로 이동하는 기능을 제공하는 익스텐션.
  • Getter Setter Generator: 자동으로 Getter와 Setter 메서드를 생성해주는 익스텐션.
  • Bracket Pair Colorizer2: 코드 블록의 시작과 끝을 색상으로 구분해주는 익스텐션.
  • Material Icon Theme: 프로젝트 파일의 아이콘을 보기 쉽게 바꿔주는 익스텐션.
  • Env: .env 파일을 보기 좋게 색상 처리를 해주는 익스텐션.

Laravel 프로젝트 디렉토리 구조

Laravel 프로젝트는 여러 중요한 파일과 디렉토리로 구성되어 있습니다. 각 파일과 디렉토리의 역할은 다음과 같습니다:

  • .env: 환경 설정 파일로, 데이터베이스 연결 정보 등이 포함됩니다.
  • config: 애플리케이션의 설정 파일들이 위치하는 디렉토리입니다.
  • artisan: Artisan 명령어를 실행하는 파일입니다.
  • composer.json: Composer를 통해 패키지를 관리하는 파일입니다.
  • package.json: Node.js 패키지를 관리하는 파일입니다.
  • webpack.mix.js: JavaScript 및 SCSS 파일을 컴파일하는 설정 파일입니다.
  • resources: Blade 뷰 파일 등 리소스들이 위치하는 디렉토리입니다.
  • routes/web.php: 웹 애플리케이션의 URL 라우팅을 정의하는 파일입니다.
  • public: 웹 애플리케이션의 공개 파일이 위치하는 디렉토리입니다. (CSS, JavaScript 등)
  • storage: 캐시, 세션, 로그 등의 파일이 저장되는 디렉토리입니다.
  • vendor: Composer 패키지들이 저장되는 디렉토리입니다.
  • bootstrap: Laravel의 초기화와 관련된 파일들이 위치하는 디렉토리입니다.
  • app/Http/Controllers: 컨트롤러 클래스가 위치하는 디렉토리입니다.
  • app/Model: 모델 클래스가 위치하는 디렉토리입니다.
  • resources/views: Blade 템플릿 파일들이 위치하는 디렉토리입니다.

20241226

Mac + Laravel

PHP 및 Laravel 설치 방법

1. PHP 설치

PHP를 설치하려면 아래 명령어를 실행합니다:

$ brew install php

2. Composer 설치

Composer는 PHP의 의존성 관리 도구로, 아래 명령어로 설치할 수 있습니다:

$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"

3. Laravel 설치

Laravel 설치를 위해 아래 명령어를 실행합니다:

$ composer global require "laravel/installer"

4. Path 설정 (추가)

Laravel 설치 후, 아래 명령어를 사용하여 Path를 설정합니다:

export PATH="$PATH:$HOME/.composer/vendor/bin"
$ source ~/.bash_profile

5. Valet 설치

Laravel Valet는 개발 환경을 관리할 수 있는 도구입니다. 아래 명령어로 Valet를 설치합니다:

$ composer global require laravel/valet
$ valet install

6. Laravel 프로젝트 설치

Laravel 프로젝트를 설치하려면 아래 명령어를 사용합니다:

$ laravel new 프로젝트이름

필요할 경우 sudo를 추가하여 설치할 수 있습니다.

7. Artisan 구동

Laravel 프로젝트를 실행하려면 아래 명령어로 Artisan 서버를 구동합니다:

$ php artisan serve

8. Artisan key error 시 해결 방법

Artisan key 오류가 발생할 경우, 아래 명령어로 해결할 수 있습니다:

$ sudo php artisan key:generate

20241225

Vue3 + Typescript + Vite + ESLint + Prettier + Pinia + Router + Tailwind

Vite, Vue3, TypeScript, ESLint, Prettier, Pinia, Vue Router, Tailwind CSS 설치 및 설정

목적

  • Vite: 빠른 빌드 도구, 서버 실행 중 추가 패키지 설치 반영
  • Vue3: 쉽고 직관적인 프레임워크
  • TypeScript: JavaScript의 기능 보완
  • ESLint: 일관성 있는 코딩을 위한 도구
  • Prettier: 일관성 있는 코딩 스타일을 위한 도구 (줄바꿈, 공백 등)
  • Pinia: Vuex 대신 사용하는 상태 관리 라이브러리
  • Vue Router: URL 라우터
  • Tailwind CSS: 유틸리티 기반의 CSS 프레임워크

프로젝트 생성

아래 명령어로 새로운 Vite 프로젝트를 생성합니다:

$ npm create vite@latest 프로젝트명 --template vue-ts

프로젝트 디렉토리로 이동하여 의존성 패키지를 설치하고 개발 서버를 실행합니다:

$ cd 프로젝트명
$ npm install
$ npm run dev

@types/node 설치

Node.js 타입을 제공하는 패키지를 설치합니다:

$ npm install --save-dev @types/node

vite.config.ts 설정

Vite 설정 파일을 작성합니다:

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import * as path from "path";

export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: { "@": path.resolve(__dirname, "./src") },
  },
});

tsconfig.json 설정

TypeScript 설정 파일을 작성합니다:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  },
  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
  "references": [{ "path": "./tsconfig.node.json" }]
}

ESLint, Prettier 설치

ESLint와 Prettier를 설치하여 코드 스타일을 일관되게 유지합니다:

$ npm install -D prettier
$ npm install -D eslint
$ npm install -D eslint-plugin-vue
$ npm install -D eslint-config-prettier
$ npm install -D @vue/eslint-config-typescript

.eslintrc.js 파일 작성하기

ESLint 설정 파일을 작성합니다:

module.exports = {
  env: {
    node: true
  },
  extends: [
    'eslint:recommended',
    'plugin:vue/vue3-recommended',
    'prettier'
  ],
  rules: [
    // override or add rules settings here
  ]
};

Pinia 설정

Pinia를 설치하고 상태 관리를 위한 플러그인을 추가합니다:

$ npm install pinia
import { createPinia } from 'pinia';

const pinia = createPinia();

...use(pinia);

Vue Router 설정

Vue Router를 설치하고 URL 라우팅을 설정합니다:

import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router";

const routes: Array = [
  { path: "/", component: () => import("../views/Home.vue") },
  { path: "/about", component: () => import("../views/About.vue") }
];

export default createRouter({
  history: createWebHistory(),
  routes,
});

main.ts 파일에서 Vue Router를 플러그인으로 추가합니다:

import router from "./router";
...use(router);

Tailwind CSS 설정

Tailwind CSS를 설치하고 설정합니다:

$ npm install -D tailwindcss@latest postcss@latest autoprefixer@latest
$ npx tailwindcss init -p

Tailwind CSS 스타일을 적용하려면 main.ts 파일에 아래를 추가합니다:

import 'tailwindcss/tailwind.css';