Hamutaro - Hamtaro 4

Backend 47

[JPA] JPA ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘ 1 - 1:N, N:1, N:N

JPA ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘JPA๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘์ด๋‹ค.RDB๋Š” ํ…Œ์ด๋ธ”๊ณผ FK๋กœ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ , JPA๋Š” ์ด๋ฅผ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. 1:N (One-To-Many)ํ•˜๋‚˜ -> ์—ฌ๋Ÿฌ ๊ฐœ ๊ด€๊ณ„์˜ˆ์‹œํšŒ์› 1๋ช… -> ์ฃผ๋ฌธ ์—ฌ๋Ÿฌ ๊ฐœ๊ฒŒ์‹œ๊ธ€ 1๊ฐœ -> ๋Œ“๊ธ€ ์—ฌ๋Ÿฌ ๊ฐœํŠน์ง•FK๋Š” ํ•ญ์ƒ N(๋‹ค) ์ชฝ์— ์กด์žฌ์‹ค์ œ๋กœ ๊ด€๊ณ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ชฝ์€ ๋Œ€๋ถ€๋ถ„ N์ชฝ1์ชฝ์—์„œ 1:N ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ๋งคํ•‘ ์˜ˆ์‹œ (์–‘๋ฐฉํ–ฅ)N:1 + 1:N ์–‘๋ฐฉํ–ฅ ์กฐํ•ฉ@Entityclass Member { @OneToMany(mappedBy = "member") private List orders = new ArrayList();}@Entityclass Order { @ManyToOne @JoinColu..

Backend/Java 2025.11.12

[JPA] JPA (Java Persistence API) ๋ž€?

JPA ๋ž€?์ž๋ฐ”์—์„œ ๊ฐ์ฒด๋ฅผ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•ด์ฃผ๋Š” ORM(Object-Relational Mapping) ๊ธฐ์ˆ SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์ €์žฅ,์กฐํšŒ,์ˆ˜์ •,์‚ญ์ œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ JPA๋ฅผ ์‚ฌ์šฉํ• ๊นŒ? MyBatis์ฒ˜๋Ÿผ SQL ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋ฉด ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค SQL ์ˆ˜์ •ํ•ด์•ผ ํ•จํ•˜์ง€๋งŒ JPA๋Š” ์—”ํ‹ฐํ‹ฐ์™€ ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•ด๋‘๋ฉด SQL์€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋จ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Œ JPA ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ๊ตฌ์„ฑ ์š”์†Œ์„ค๋ช…EntityDB ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋Š” ์ž๋ฐ” ํด๋ž˜์Šค RepositoryCRUD๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์ŠคEntitiyManagerJPA์˜ ํ•ต์‹ฌ ๊ฐ์ฒด. ์—”ํ‹ฐํ‹ฐ ์ €์žฅ, ์กฐํšŒ ๊ด€๋ฆฌPersistence Context์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ 1์ฐจ ์บ์‹œ..

Backend/Java 2025.11.07

[Python] ๋ฐฐ์—ด ์Šฌ๋ผ์ด์‹ฑ

ํŒŒ์ด์ฌ์˜ ๋ฐฐ์—ด ์Šฌ๋ผ์ด์‹ฑ ๊ธฐ๋ณธarr = ['a', 'b', 'c', 'd', 'e'] ํŠน์ •์œ„์น˜๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐarr [ 2: ] --> [ 'c', 'd', 'e' ]์‹œ์ž‘๋ถ€ํ„ฐ ํŠน์ •์œ„์น˜๊นŒ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐarr [ :3 ] --> [ 'a', 'b', 'c', 'd' ]ํŠน์ •์œ„์น˜์— ์žˆ๋Š” ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐarr [ 2:4 ] --> [ 'c', 'd', 'e' ] ๋ฐฐ์—ด ์Šฌ๋ผ์ด์‹ฑ์„ ํ™œ์šฉํ•œ ์˜ˆ์ œ๋ฌธ์ž์—ด my_string, overwrite_string ๊ณผ ์ •์ˆ˜ s ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.๋ฌธ์ž์—ด my_string์˜ ์ธ๋ฑ์Šค s๋ถ€ํ„ฐ overwrite_string์˜ ๊ธธ์ด๋งŒํผ ๋ฌธ์ž์—ด overwrite_string์œผ๋กœ ๋ฐ”๊พผ ๋ฌธ์ž์—ด์„ returnํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑ def solution(my_string, overwrite_stri..

Backend/Python 2025.04.30

[Python] ๋Œ€์†Œ๋ฌธ์ž ๋ฐ”๊ฟ”์„œ ์ถœ๋ ฅํ•˜๊ธฐ

ํŒŒ์ด์ฌ์œผ๋กœ ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜ํ•˜๊ธฐaBcDeF -> AbCdEf ์ด๋Ÿฐ์‹์œผ๋กœ ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜ํ•˜๊ธฐ์ž๋ฐ”์— ๋น„ํ•˜๋ฉด ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•œ ํŒŒ์ด์ฌ ์ฝ”๋“œ๊ทธ๋Ÿฐ๋ฐ ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹คstr = input()answer = ''for i in str: if i.isupper() == True: answer += i.lower() elif i.islower() == True: answer += i.upper()print(answer) ํŒŒ์ด์ฌ ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜ swapcaseํŒŒ์ด์ฌ์—๋Š” swapcase ๋ผ๋Š” ๋‚ด์žฅํ•จ์ˆ˜๊ฐ€ ์žˆ์–ด์„œ ์•„์ฃผ ๊ฐ„๋‹จํžˆ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹คstr = input()print(str.swapcase())

Backend/Python 2025.04.29

[Python] ๋ฌธ์ž์—ด ์ถœ๋ ฅํ•˜๊ธฐ

print ์ž…๋ ฅ๋ฐ›์€ str์„ n๋ฒˆ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œprint() ์— end="" ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ค„๋ฐ”๊ฟˆ์—†์ด ์ถœ๋ ฅํ•จstr, n = input().strip().split(' ')n = int(n)for i in range(n): print(str, end="")   ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž๋ฐ”๋กœ ๋ฐ”๊พผ๋‹ค๋ฉด...  import java.util.Scanner;public class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); String s = ""; int n = sc.nextInt(); ..

Backend/Python 2025.03.15

[Spring] JWT (JSON Web Token)

JWT ๋ž€?JSON Web Token, JSON ๊ฐ์ฒด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์ž๊ธฐ ํฌํ•จ (Self-contained) : ํ† ํฐ์•ˆ์— ์œ ์ € ์ •๋ณด๋‚˜ ๊ถŒํ•œ ๊ฐ™์€ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ง์ ‘ ๋‹ด๊ณ  ์žˆ์–ด์„œ ๋ณ„๋„์˜ ์„ธ์…˜ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”์—†์Œ์„œ๋ช… (Signature) : ํ† ํฐ์€ ์„œ๋ช…๋˜์–ด ์žˆ์–ด์„œ ๋‚ด์šฉ์ด ์œ„์กฐ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•จStateless : ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ํ•„์š”์—†์ด ํ† ํฐ๋งŒ ํ™•์ธํ•˜๋ฉด ๋จ JWT ๊ตฌ์กฐHeader : ํ† ํฐ์˜ ํƒ€์ž…๊ณผ ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (ex : HS256)Payload : ์œ ์ € ์ •๋ณด ๋ฐ ํด๋ ˆ์ž„(claims)์ด ํฌํ•จ๋˜๋Š” ๋ฐ์ดํ„ฐ (ex : sub, name, exp ๋“ฑ)Signature : ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋น„๋ฐ€ํ‚ค๋กœ ํ•ด์‹ฑํ•œ ์„œ๋ช… JWT util class ์˜ˆ์ œimport io.j..

Backend/Spring 2025.02.18

[Spring] IAM(Identity and Access Management) ์ธ์ฆ ์„œ๋ฒ„

IAM(Identity and Access Management) ์ธ์ฆ ์„œ๋ฒ„์‚ฌ์šฉ์ž ๋˜๋Š” ์‹œ์Šคํ…œ์˜ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๊ณ , ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ํ‰๊ฐ€ํ•˜๋Š” ์—ญํ•  IAM ์ธ์ฆ ์„œ๋ฒ„์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์ธ์ฆ (Authentication)์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•  ๋•Œ ๋ณธ์ธ์ด ๋ˆ„๊ตฌ์ธ์ง€ ์ฆ๋ช…ํ•˜๋„๋ก ํ•จ์ผ๋ฐ˜์ ์œผ๋กœ ID/๋น„๋ฐ€๋ฒˆํ˜ธ, ์ƒ์ฒด ์ธ์ฆ, ์ธ์ฆ ํ† ํฐ ๋“ฑ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง๊ถŒํ•œ ๋ถ€์—ฌ (Authorization)์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธ์—ญํ• (Role) ๊ธฐ๋ฐ˜, ์ •์ฑ…(Policy) ๊ธฐ๋ฐ˜, ์†์„ฑ(Attribute) ๊ธฐ๋ฐ˜์˜ ์ ‘๊ทผ ์ œ์–ด ๋ชจ๋ธ์„ ํ™œ์šฉ์„ธ์…˜ ๋ฐ ํ† ํฐ ๊ด€๋ฆฌ์„ธ์…˜ ๊ด€๋ฆฌ : ์‚ฌ์šฉ์ž ์ธ์ฆ ํ›„ ์„ธ์…˜์„ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ..

Backend/Spring 2025.01.19

[SpringBoot] ์Šคํ”„๋ง๋ถ€ํŠธ +Thymeleaf + H2 Database + JPA - ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ค์ • ๋ฐ H2 DB ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ

ํ™˜๊ฒฝIDE : VScodeJava : 17SpringBoot : v3.4.0Gradle : v8.11.1DB : H2  1.Spring Initializr ์ด์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ Packaging : JarJava version : 17 (์ž์‹ ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ฒ„์ „. ํ„ฐ๋ฏธ๋„์—์„œ java -version ๋ช…๋ น์–ด๋กœ ํ™•์ธ)Dependencies : Spring Web, Spring Data JPA, H2 Database, LombokVScode Extensions : Spring Boot Extensions Pack, Java Extension Pack  2. application.properties (application.yml) ์„ค์ • ๋‚˜๋Š” yml์„ ์‚ฌ์šฉํ–ˆ๋‹ค.application.properties : ke..

Backend/Spring 2024.12.12

[Java] ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ(Primitive) ํƒ€์ž…๊ณผ ๋ ˆํผ๋Ÿฐ์Šค(Reference) ํƒ€์ž…

Primitive TypeJava์˜ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ํƒ€์ž…์€ 8๊ฐ€์ง€byte, short, int, long, float, double, char, boolean์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋จ (์‹คํ–‰ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์›€)๊ฐ’์ด ์ƒ์„ฑ๋˜๋ฉด ์Šคํƒ ์˜์—ญ์— ์ง์ ‘ ํ• ๋‹น๋˜๋ฉฐ, ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์‚ฌ๋ผ์งint number = 10;  Null์„ ๋‹ด์„ ์ˆ˜ ์—†์Œint number = null; //๋ถˆ๊ฐ€๋Šฅ์ œ๋„ค๋ฆญ ํƒ€์ž… ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋ŠฅList number; //๋ถˆ๊ฐ€๋Šฅ   Reference Type๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ํƒ€์ž…ํด๋ž˜์Šค, ๋ฐฐ์—ด, ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋จ (ํฐ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฐ€๋Šฅ, ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๊ธด ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ์ ํ•ฉ)๋™์ ์œผ๋กœ ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋˜๋ฉฐ, ๊ฐ์ฒด๊ฐ€ ํ•„์š”์—†์„ ๋•Œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ •๋ฆฌ๋จHello Wo..

Backend/Java 2024.12.07