728x90
반응형

Springboot에서 기본적으로 사용하고 있는 DB네이빙 룰(DB Physical Naming Strategy)은 아래와 같습니다!

  1. 모든 테이블명은 소문자
  2. 카멜케이스 대문자는 '_'로 대체됨

그럼 이미 대문자로 DB스키마를 설계한 경우, 전부 소문자로 바꿔줘야 할까요?!

 

아닙니다!

 

위의 사진처럼 application.yml 파일에서 JPA의 네이밍 규칙을 모델에 설정된 규칙으로 변경한다고 설정해 주기만 하면 대문자로 테이블을 관리할 수 있습니다!

 

 

Model 클래스에서 Table 명세를 대문자로 해둔 것처럼 JPA가 대문자 테이블을 잘 잡아오는 것을 알 수 있습니다~

 

출처 : 

 

JPA Entity Table 대소문자 네이밍 에러

문제 발생 JPA를 통해 Entity를 생성할 때 name 속성으로 "USER_TB" 이렇게 대문자로 지정해줬는데 서버를 실행하고 나니 'user_tb'을 찾을 수 없다는 에러가 발생했다. 뭔가 이상해서 ddl-auto를 create로 지

bbogle2.tistory.com

 

728x90
반응형
728x90
반응형

springboot와 jpa를 활용한 프로젝트를 생성 중인데 데이터 입력일자와 수정일자가 자동으로 입력될 수 있도록 모든 dto가 이러한 기능을  상속받게 만들고 싶었습니다.

근데 인터넷 예제들 중 어떤 것들은 abstract로, 어떤 예제들은 class로 만들었기 때문에 차이에 대해서 물어보았습니다.

 

대답은 아래와 같았습니다. 

 

입력일자와 수정일자를 자동으로 셋팅해주는 기능을 모든 DTO가 상속받을 수 있도록 구현하려면 보통 추상 클래스나 클래스의 메서드로

구현합니다. 추상 클래스와 클래스의 메서드를 사용하는 것 모두 가능하며, 각각의 방식에는 장단점이 있습니다.

 

 

1. 추상 클래스(Abstract class) 사용:


  • 추상 클래스를 사용하여 공통 필드와 메서드를 정의하고, 이를 상속받아 사용합니다.
  • 장점: 코드 재사용성이 높아집니다. 공통적인 기능을 한 곳에서 관리할 수 있어 유지보수가 편리합니다.
  • 단점: Java는 다중 상속을 지원하지 않으므로, 이미 다른 클래스를 상속받은 경우 추상 클래스를 상속받을 수 없습니다.

 

2. 클래스의 메서드 사용:


  • 클래스 내에 공통적으로 필요한 메서드를 정의하여 사용합니다. 필요한 클래스에 메서드를 호출하여 사용합니다.
  • 장점: 클래스의 메서드를 사용하기 때문에 다중 상속이 필요하지 않습니다. 필요한 클래스에 직접 메서드를 호출하여 사용할 수 있습니다.
  • 단점: 각각의 클래스에 메서드를 호출해야 하므로, 코드 중복이 발생할 수 있습니다.

 

 

즉! 어떤 방법을 선택할지는 프로젝트의 구조와 요구 사항에 따라 달라집니다. 보통은 추상 클래스를 사용하여 공통적인 기능을 구현하고, 필요한 경우 클래스의 메서드를 사용하여 추가적인 기능을 구현한다고 합니다.

728x90
반응형
728x90
반응형

문제

https://school.programmers.co.kr/learn/courses/30/lessons/120956

정답

def solution(babbling):
    answer = 0
    
    arr = ["aya", "ye", "woo", "ma" ]
    
    for x in babbling:
        for y in arr:
            x = x.replace(y, ' ')
            if x.strip() == "":
                answer += 1
                break;
        
    return answer

풀이

  • 같은 문자열을 찾으면 ""이 아니라 " "로 replace한다!
    • 케이스) "wyeoo" 
      • x.replace(y, "")  : "wyeoo" ➡️ "woo" ➡️ ""
      • x.replace(y, " ") : "wyeoo" ➡️ "w  oo" ➡️ "w oo"
728x90
반응형
728x90
반응형

 

안녕하세요!

저에게는 jdk11과 jdk17이 모두 필요한 슬픈 사연이 생겼습니다...

하지만 한 대의 컴퓨터에게 자동으로 내가 필요한 자바 버전을 찾아라! 하는 것은 불가능한가봅니다...훌쩍

 

매번 openjdk를 지웠다 까는 행태를 반복하다가 이건 아니다 싶어서 구글링 시작!

역시나 손쉽게 자바 버전을 변경하는 방법이 있었습니다~

 

제가 참고한 글을 첨부 드리니 참고 바랍니다! 

 

[MacOS] JDK 설치, 환경변수 설정하기(+ jdk 버전 변경)

Overview iTerm과 zsh 설치 (처음으로 macOS 접하신 분들 한해서) homebrew 설치 기본적인 JDK 설치 및 링크 설정하기 JDK 버전 수동으로 변경하기 JDK 버전 간편하게 변경하기 📌 1. Overview 윈도우 운영체제

beaniejoy.tistory.com

 

자자 이제 본격적으로 블로그를 따라서 시작해보겠습니다.

 

터미널에서 아래 명령어 입력! unix 서버에서는 .profile을 사용했었는데, 맥이니까 새로운 마음으로 .zshrc를 사용해보겠습니다.

vim ~/.zshrc

 

i 입력해서 INSERT모드로 바뀌면 아래 내용을 작성한 뒤 esc키를 누르고 wq!입력 후 엔터!

jdk() {
      version=$1
      unset JAVA_HOME;
      export JAVA_HOME=$(/usr/libexec/java_home -v"$version");
      unset PATH;
      export PATH=$JAVA_HOME/bin:$PATH;
      java -version
}

 

변경 내용을 적용하기 위해서 터미널에서 아래 명령어를 입력해주세요!

source ~/.zshrc

 

자 그럼 터미널에서 테스트해볼까요?

# idk 11로 변경하기
jdk 11

# idk 17로 변경하기
jdk 17

 

짜잔!

1초만에 자바 버전 바꾸기 성공했습니다~

728x90
반응형
728x90
반응형

 

 

EC2의 세부정보에 들어가보면 [퍼블릭 IPv4 주소]에 탄력적 IP의 [프라이빗 IP 주소]가 할당된 것을 볼 수 있다!

 

  • 참고 사이트 : 
 

Github Action을 활용한 배포 자동화 CI/CD - (1) EC2 생성하기

해커톤에서 구축했던 서버 환경을 다시 한번 세팅해보기 시리즈 1탄 : ec2 인스턴스 생성하기

velog.io

 

728x90
반응형
728x90
반응형

 

 

  •  
  •  
  • 참고한 사이트 : 
 

Github Action을 활용한 배포 자동화 CI/CD - (1) EC2 생성하기

해커톤에서 구축했던 서버 환경을 다시 한번 세팅해보기 시리즈 1탄 : ec2 인스턴스 생성하기

velog.io

 

728x90
반응형
728x90
반응형

 

아직도 귀찮게 사이트 접속해서 다운받고 압축 풀어서 설치하는 분 없죠?

오늘도 손쉽게 Homebrew를 활용해서 개발환경을 셋팅해봅시다!

 


 

1. 인텔리제이 설치하기


인텔리제이는 무료버전인 community 버전과 유료인 ultimate 버전이 있습니다.

저는 이미 졸업을 했지만 대학교 메일이 있다면 ultimate이 1년씩 무료로 사용이 가능해요! 그래서 저는 ultimate 버전을 설치해주었습니다!

 

🍺 아래 명령어로 손쉽게 설치하세요!

brew install --cask intellij-idea

 

- 명령어 확인은 여기서 👇

https://formulae.brew.sh/cask/intellij-idea#default

 

intellij-idea

Homebrew’s package index

formulae.brew.sh

무료버전인 community 버전을 설치하시려면, intellij-idea-ce 를 설치해주시면 됩니다!

brew install --cask intellij-idea-ce

 

 

 

2. JDK 설치


 

인텔리제이에서 스프링부트 플젝을 만드려는데 JDK가 없네요!

 

JDK를 깔아줘야겠습니다...

근데 자바는 17과 21 선택지가 두개뿐이더라구요...🤔 보통 저는 자바8이나 자바 11을 사용했었는데 왜 없지...?

 

 

구글링해보니 인텔리제이 최신버전을 받아서 그런 것 같습니다...

스프링부트3부터는 자바17 이상 사용이 필수라 인텔리제이 최신버전에서도 17이상만 선택하도록 바꿔버린 것 같아요!

https://okky.kr/questions/1486525

 

최신 기술은 조금 무서운데... 고분고분하게 JDK17을 깔도록 하겠습니다!

 

 

🍺 터미널창에서 아래 명령어를 입력하세요!

brew install openjdk@17

 

 

 

openjdk@17

Homebrew’s package index

formulae.brew.sh

 

설치완료!

 

이제 무지성으로 시키는대로 환경변수 설정 해볼겠습니다ㅎㅎ;;

sudo ln -sfn /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk
echo 'export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"' >> ~/.zshrc
export CPPFLAGS="-I/opt/homebrew/opt/openjdk@17/include"

 

완료!

 

JDK17버전이 잘 선택되네요 ㅎㅎ

 

2. Git 설치


그 담으로는 git을 설치해보겠습니다...

 

🍺 터미널창에서 아래 명령어를 입력하세요!

brew install git


설치가 완료되면 아래 명령어로 잘 설치되었는지 확인해보시면 됩니다!

git —version

 

 

 


 

이렇게 기초적인 개발환경을 셋팅해보았습니다!

다음에는 스프링부트 프로젝트를 만들어보면서 차차 나머지 환경셋팅을 해보도록 하겠습니다~

728x90
반응형
728x90
반응형

맥북을 샀습니다! 뭘해야할까요?
바로 Homebrew 설치!
귀찮게 다운받고 압출풀고 다음단계클릭...안해도 터미널에서 명령어 하나만 입력하면 프로그램 설치해주는 기특한 녀석이랍니다~
그럼 바로 brew 설치하러 고고싱~
 

1. Home brew 설치하기


터미널창 키셔서 아래 명령어 입력하세요 !

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

 
설치가 완료되면 이런 안내문이 뜨는데요...

==> Next steps:

- Run these two commands in your terminal to add Homebrew to your PATH:

    (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/본인컴퓨터명/.zprofile

    eval "$(/opt/homebrew/bin/brew shellenv)"

 
무지성으로 따라 쳤습니다 헤헤! profile 폴더에 환경변수 같은 것 설정하는 것 같아요;;

(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/ihaeni/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

 
- Homebrew홈페이지 : https://brew.sh

Homebrew

The Missing Package Manager for macOS (or Linux).

brew.sh

 

2. Chrome 설치


이제 크롬부터 설치해야겠죠? 내 소중한 북마크 찾아와야 하니까요...
아까 알려드린 Homebrew 사이트에서 chrome 검색하시면 명령어가 나옵니다!
근데 귀찮으니 제가 알려드릴게요 헤헤!

brew install --cask google-chrome

순식간에 설치 완료! launch pad 들어가시면 chrome 아이콘이 생긴 것을 볼 수 있을거에요~
- chrome 검색결과 : https://formulae.brew.sh/cask/google-chrome#default

google-chrome

Homebrew’s package index

formulae.brew.sh

 
 

3. 카카오톡 설치


카카오톡을 까는 명령어는 homebrew 홈페이지에 안나와 있어요 ㅠㅠ 그래도 깔 수 있습니다!
왜냐하면 brew명령어 중에서 앱스토어에 있는 앱 깔 수 있게 하는 기능도 있거든요~ 그 기능을 사용하기 위해서 mas를 먼저 깔아줍니다.

brew install mas

이제 설치는 너무 쉽죠?
mas 설치가 완료되면 카카오톡을 깔기위한 앱번호(?)를 알아야해요!

mas search KaKaoTalk

이렇게 검색하면 카카오톡에 부여된 숫자를 알 수 있어요!

카카오톡은 869223134인 것을 확인하고 설치 시작!

mas install 869223134

설치완료 후, launch에 들어가시면 크롬과 카카오톡이 깔려있는 것을 볼 수 있습니다!

참 쉽죠잉?
그럼 다음에는 개발환경 셋팅하는 방법으로 찾아오겠습니다!

728x90
반응형
728x90
반응형

문제


https://school.programmers.co.kr/learn/courses/30/lessons/157339

 

정답


-- 코드를 입력하세요
SELECT AA.CAR_ID, BB.CAR_TYPE, BB.FEE FROM
(
    SELECT 
        B.CAR_ID CAR_ID, 
        MAX(START_DATE) START_DATE2,
        MAX(END_DATE) END_DATE2
    FROM 
        CAR_RENTAL_COMPANY_CAR A, 
        CAR_RENTAL_COMPANY_RENTAL_HISTORY B
    WHERE 1=1
        AND A.CAR_ID = B.CAR_ID
    GROUP BY B.CAR_ID
) AA
,(
    SELECT 
        A.CAR_ID AS CAR_ID
        ,A.CAR_TYPE AS CAR_TYPE
        ,(A.DAILY_FEE * (1-B.DISCOUNT_RATE*0.01) * 30) AS FEE
    FROM CAR_RENTAL_COMPANY_CAR A, CAR_RENTAL_COMPANY_DISCOUNT_PLAN B
    WHERE 1=1
        AND A.CAR_TYPE = B.CAR_TYPE
        AND A.CAR_TYPE IN ('세단', 'SUV')
        AND B.DURATION_TYPE = '30일 이상'
) BB
WHERE 1=1
    AND AA.CAR_ID = BB.CAR_ID
    AND ( AA.START_DATE2 > TO_DATE('20221130', 'YYYYMMDD') 
         OR AA.END_DATE2 < TO_DATE('20221101', 'YYYYMMDD') )
    AND BB.FEE >= 500000 AND BB.FEE < 2000000
ORDER BY FEE DESC, CAR_TYPE, CAR_ID DESC
;

 

결과


 

CAR_ID CAR_TYPE FEE
3 세단 1518000
23 세단 1380000

 

풀이


아래 두 테이블을 JOIN하면 되는 문제이다.

 

1.  2022년 11월 1일부터 2022년 11월 30일까지 대여 가능한 차동차 구하기

SELECT * FROM
(
    SELECT 
        B.CAR_ID CAR_ID, 
        MAX(START_DATE) START_DATE2,
        MAX(END_DATE) END_DATE2
    FROM 
        CAR_RENTAL_COMPANY_CAR A, 
        CAR_RENTAL_COMPANY_RENTAL_HISTORY B
    WHERE 1=1
        AND A.CAR_ID = B.CAR_ID
        AND A.CAR_TYPE IN ('세단', 'SUV')
    GROUP BY B.CAR_ID
) AA
WHERE 1=1
    AND ( AA.START_DATE2 > TO_DATE('20221130', 'YYYYMMDD') 
         OR AA.END_DATE2 < TO_DATE('20221101', 'YYYYMMDD') )
;

 

2. 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차 구하기

SELECT * FROM
(
    SELECT 
        A.CAR_ID AS CAR_ID
        ,A.CAR_TYPE AS CAR_TYPE
        ,(A.DAILY_FEE * (1-B.DISCOUNT_RATE*0.01) * 30) AS FEE
    FROM CAR_RENTAL_COMPANY_CAR A, CAR_RENTAL_COMPANY_DISCOUNT_PLAN B
    WHERE 1=1
        AND A.CAR_TYPE = B.CAR_TYPE
        AND A.CAR_TYPE IN ('세단', 'SUV')
        AND B.DURATION_TYPE = '30일 이상'
) BB
WHERE 1=1
    AND BB.FEE >= 500000 AND BB.FEE < 2000000
;
728x90
반응형
728x90
반응형

Java


1) 기본형변수 : 값으로 전달(Pass By Value)
2) 참조형변수 : 객체주소가 전달(Pass By Reference)
기본형변수 : boolean, char, byte, short, int, long, float, double (Stack메모리에 값 저장)
참조형변수 : Integet, Boolean, String... (Stack메모리에 주소 저장, Heap메모리에 값 저장)

자바에서는 파이썬과는 달리 매개변수 전달 방식이 다릅니다. 자바에서는 모든 매개변수가 값으로 전달됩니다. 이 말은 변수가 메서드로 전달될 때, 실제 값이 전달되는 것이지 변수의 참조가 전달되는 것이 아니라는 것입니다. 따라서 자바에서는 메서드 내에서 매개변수의 값이 변경되어도 호출자에게 영향을 주지 않습니다.

그러나 참조형 변수(예: 객체)를 매개변수로 전달할 때, 그 객체의 주소(참조)가 복사되어 전달됩니다. 이 경우, 메서드 내에서 객체의 내용을 변경하면 호출자에게도 그 변경이 반영됩니다.

예를 들어, 자바에서 배열을 메서드의 매개변수로 전달하면 배열의 주소가 전달되므로 메서드 내에서 배열의 요소를 변경하면 호출자에게도 그 변경이 반영됩니다. 하지만 매개변수로 전달된 참조 변수 자체를 다른 객체로 변경하더라도 호출자에게는 영향을 주지 않습니다.

다음은 자바에서의 예시입니다:

public class Main {
    public static void main(String[] args) {
        int[] array = {1, 2, 3};
        modifyArray(array);
        System.out.println(Arrays.toString(array)); // [2, 4, 6]
    }
    
    public static void modifyArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] *= 2;
        }
    }
}

 

C언어


C 언어에서는 함수에 매개변수를 전달할 때 값에 의한 호출(pass-by-value)이 기본적으로 사용됩니다. 이는 변수의 값을 복사하여 함수로 전달하므로 함수 내에서 매개변수의 값을 변경해도 호출자에게는 영향을 주지 않습니다.

그러나 포인터를 사용하여 주소(참조)를 전달할 수도 있습니다. 포인터를 통해 변수의 주소를 전달하면 함수 내에서 해당 주소의 값을 변경할 수 있으며, 이는 호출자에게도 영향을 줍니다.

예를 들어, 배열을 함수의 매개변수로 전달할 때 실제로는 배열의 첫 번째 요소의 주소가 함수에 전달됩니다. 따라서 함수 내에서 배열의 요소를 변경하면 호출자에게도 그 변경이 반영됩니다.

다음은 C 언어에서의 예시입니다:

#include <stdio.h>

void modifyArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        arr[i] *= 2;
    }
}

int main() {
    int array[] = {1, 2, 3};
    int size = sizeof(array) / sizeof(array[0]);
    
    modifyArray(array, size);
    
    for (int i = 0; i < size; i++) {
        printf("%d ", array[i]); // 출력: 2 4 6
    }
    
    return 0;
}

 

Python


파이썬에서는 변수를 함수에 전달할 때, 값이 아니라 객체의 참조가 전달됩니다. 이것은 C나 자바와는 약간 다릅니다.

정확하게 말하자면, 객체의 주소(참조)가 전달되는 것이 아니라 객체의 참조(즉, 메모리 상의 위치)가 전달됩니다. 이 말은 함수가 객체를 변경할 때 객체의 내용이 아니라 객체에 대한 참조가 변경되는 것입니다.

예를 들어, 다음과 같은 코드를 살펴보겠습니다:

def modify_list(my_list):
    my_list.append(4)
    my_list = [1, 2, 3]

def solution():
    a = [0]
    modify_list(a)
    print(a)  # 출력: [0, 4]

위 코드에서 a라는 리스트를 함수에 전달하면 함수 내에서 my_list라는 이름으로 그 값을 받게 됩니다. 함수 내에서 리스트에 append 메서드를 사용하여 요소를 추가한 후, my_list를 새로운 리스트로 덮어씌우면서 변경합니다. 그러나 이 변경은 a 변수에는 영향을 주지 않습니다. 이는 modify_list 함수 내에서 my_list가 새로운 리스트로 덮어씌워졌지만, 이는 함수 내에서만 적용되고 호출자의 a 변수에는 영향을 주지 않기 때문입니다.

따라서 파이썬에서는 변수를 함수에 전달할 때 값이 아니라 객체에 대한 참조가 전달되며, 이로 인해 함수 내에서 객체의 내용을 변경할 때 호출자에게 영향을 줄 수 있습니다. 하지만 변수 자체를 변경하더라도 호출자에게는 영향을 주지 않습니다.

 

파이썬에서 append와 = 차이가 뭔데?


append와 = 연산자는 리스트에 대해 다른 작업을 수행합니다.

1. append: append 메서드는 리스트에 새로운 요소를 추가합니다. 기존 리스트에 새로운 요소가 뒤에 추가되는 것이기 때문에 리스트의 크기가 늘어납니다.

my_list = [1, 2, 3]
my_list.append(4)
print(my_list)  # 출력: [1, 2, 3, 4]

2. = (할당 연산자): 할당 연산자는 변수에 새로운 값을 할당합니다. 이 때 변수가 참조하는 객체가 변경되는 것이 아니라 변수 자체가 새로운 객체를 참조하게 됩니다. 이전 객체에 대한 참조는 끊기게 됩니다.

my_list = [1, 2, 3]
my_list = [4, 5, 6]  # 새로운 리스트를 할당
print(my_list)  # 출력: [4, 5, 6]

따라서 append 메서드는 리스트의 내용을 변경하고, = 연산자는 변수가 참조하는 객체를 변경합니다. 이러한 차이로 인해 append 메서드는 원래 리스트에 새로운 요소를 추가하고, = 연산자는 변수가 새로운 객체를 참조하도록 만듭니다.

 

하지만 자바에서는?


= (할당 연산자) : 할당 연산자는 변수에 새로운 값을 할당합니다. 이 때 변수가 참조하는 객체가 변경되는 것이 아니라 변수 자체가 새로운 객체를 참조하게 됩니다. 이전 객체에 대한 참조는 끊기게 됩니다.

import java.util.ArrayList;

public class Main {
    public static void modifyList(ArrayList<Integer> myList) {
        myList.add(4);
        myList = new ArrayList<Integer>();
        myList.add(1);
        myList.add(2);
        myList.add(3);
    }

    public static void main(String[] args) {
        ArrayList<Integer> a = new ArrayList<>();
        a.add(0);
        modifyList(a);
        System.out.println(a);  // 출력: [0, 4]
    }
}

위 코드에서 modifyList 메서드는 리스트에 4를 추가한 후, 새로운 리스트를 할당하고 요소 1, 2, 3을 추가합니다. 그러나 이 변경은 호출자인 main 메서드에서의 a 변수에는 영향을 주지 않습니다. 호출자인 main 메서드에서의 a 변수는 여전히 원래의 리스트를 참조하고 있기 때문에 [0, 4]를 출력합니다.

 

출처 : ChatGPT

728x90
반응형

+ Recent posts