Backend

Backend/Sequelize

[Sequelize] Sequelize findAndCountAll λ©”μ„œλ“œ μ‚¬μš© μ‹œ countκ°€ μ˜ˆμƒλ³΄λ‹€ 더 많이 μΉ΄μš΄νŒ… λ˜λŠ” 문제 ν•΄κ²°

πŸ”₯ λ°œμƒν•œ 문제 getBoards ν•¨μˆ˜λŠ” μΉ΄ν…Œκ³ λ¦¬μ— ν•΄λ‹Ήν•˜λŠ” κ²Œμ‹œκΈ€ 전체λ₯Ό νŽ˜μ΄μ§• μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ ν•¨μˆ˜λ‹€. (가독성을 μœ„ν•΄ κ΄€λ ¨ μ—†λŠ” μ½”λ“œ 일뢀 μƒλž΅) /* νŽ˜μ΄μ§• 처리λ₯Ό μœ„ν•œ ν•¨μˆ˜λ“€(참고용) const getPagination = (page, size) => { const limit = size ? +size : 10; // κ°€μ Έμ˜¬ 데이터 μ–‘ const offset = page ? page * limit : 0; // κ°€μ Έμ˜¬ λ°μ΄ν„°μ˜ 초기 μœ„μΉ˜κ°’ return { limit, offset }; }; const getPagingData = (data, page, limit) => { // count: where 절, μ—°κ²° 관계 λ“±μ˜ 쑰건에 λΆ€ν•©ν•˜λŠ” λ ˆμ½”λ“œμ˜ 전체 개수 // rows: where 절, μ—°κ²° κ΄€..

Backend/Spring

[Spring] 쒋은 객체 지ν–₯ μ„€κ³„μ˜ 5가지 원칙(SOLID)

SRP(Single responsibility principle) 단일 μ±…μž„ 원칙 ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Ό ν•œλ‹€. μ€‘μš”ν•œ 기쀀은 변경이닀. 변경이 μžˆμ„ λ•Œ νŒŒκΈ‰ νš¨κ³Όκ°€ 적으면 단일 μ±…μž„ 원칙을 잘 λ”°λ₯Έ 것이닀. ex) UI λ³€κ²½, 객체의 생성과 μ‚¬μš©μ„ 뢄리 OCP(Open/closed principle) 개방-폐쇄 원칙 μ†Œν”„νŠΈμ›¨μ–΄ μš”μ†ŒλŠ” ν™•μž₯μ—λŠ” μ—΄λ € μžˆμœΌλ‚˜ λ³€κ²½μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€. λ‹€ν˜•μ„±μ„ μ‚¬μš©ν•˜λ”λΌλ„ OCP 원칙을 지킬 수 μ—†λ‹€λŠ” 문제점(ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ λ³€κ²½)이 μžˆλ‹€. 객체λ₯Ό μƒμ„±ν•˜κ³ , 연관관계λ₯Ό λ§Ίμ–΄μ£ΌλŠ” λ³„λ„μ˜ 쑰립, μ„€μ •μžκ°€ ν•„μš”ν•˜λ‹€. (μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ˜ μ—­ν• ) LSP(Liskov substitution principle) λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙 ν”„λ‘œκ·Έλž¨μ˜ κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ 정확성을 깨뜨..

Backend/Java

[Java] μ—΄κ±°ν˜•(enum)μ΄λž€?

* λ³Έ λ‚΄μš©μ€ 을 μ°Έκ³ ν•˜μ—¬ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ● μ—΄κ±°ν˜•μ€ μ—¬λŸ¬ μƒμˆ˜λ₯Ό μ„ μ–Έν•΄μ•Ό ν•  λ•Œ, νŽΈλ¦¬ν•˜κ²Œ μ„ μ–Έν•  수 μžˆλŠ” 방법이닀. ● 일반적으둜 μƒμˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 방법 class Card { static final int CLOVER = 0; static final int HEART = 1; static final int DIAMOND = 2; static final int SPADE = 3; final int kind; } ● μ—΄κ±°ν˜•μ„ μ΄μš©ν•˜μ—¬ μƒμˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 방법 class Card { enum Kind { CLOVER, HEART, DIAMOND, SPADE } final Kind kind; } λ”°λ‘œ 값을 지정해주지 μ•Šμ•„λ„ μžλ™μ μœΌλ‘œ 0λΆ€ν„° μ‹œμž‘ν•˜λŠ” μ •μˆ˜κ°’μ΄ ν• λ‹Ήλœλ‹€. μ—΄κ±°ν˜•μ„ μ •μ˜ν•˜λŠ” 방법 - enum μ—΄κ±°..

Backend/Java

[Java] μ˜€λ²„λΌμ΄λ”©(overriding)μ΄λž€?

* λ³Έ λ‚΄μš©μ€ 을 μ°Έκ³ ν•˜μ—¬ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ● μ •μ˜ 쑰상 ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 λ©”μ„œλ“œμ˜ λ‚΄μš©μ„ λ³€κ²½ν•˜λŠ” 것을 λ§ν•œλ‹€. 상속받은 λ©”μ„œλ“œλ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜κΈ°λ„ ν•˜μ§€λ§Œ, μžμ† 클래슀 μžμ‹ μ— 맞게 λ³€κ²½ν•΄μ•Όν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. 이럴 λ•Œ μ‘°μƒμ˜ λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•œλ‹€. class Point { int x; int y; String Location() { return x + y; } } class Point3D extends point { int z; String Location() { return x + y + z; } } ● μ˜€λ²„λΌμ΄λ”©μ˜ 쑰건 μ„ μ–ΈλΆ€κ°€ 쑰상 클래슀의 λ©”μ„œλ“œμ™€ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€. μ ‘κ·Ό μ œμ–΄μžλ₯Ό 쑰상 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ 쒁은 λ²”μœ„λ‘œ λ³€κ²½ν•  수 μ—†λ‹€. (public > protected > (default) ..

Backend/Java

[Java] Map μΈν„°νŽ˜μ΄μŠ€

* λ³Έ λ‚΄μš©μ€ 을 μ°Έκ³ ν•˜μ—¬ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ● MapμΈν„°νŽ˜μ΄μŠ€λŠ” ν‚€(key)와 κ°’(value)을 ν•˜λ‚˜μ˜ 쌍으둜 λ¬Άμ–΄μ„œ μ €μž₯ν•˜λŠ” μ»¬λ ‰μ…˜ 클래슀λ₯Ό κ΅¬ν˜„ν•˜λŠ” 데 μ‚¬μš©λœλ‹€. ν‚€λŠ” 쀑볡될 수 μ—†μ§€λ§Œ 값은 쀑볡을 ν—ˆμš©ν•œλ‹€. 기쑴에 μ €μž₯된 데이터와 μ€‘λ³΅λœ 킀와 값을 μ €μž₯ν•˜λ©΄ 기쑴의 값은 없어지고 λ§ˆμ§€λ§‰μ— μ €μž₯된 값이 λ‚¨κ²Œ λœλ‹€. MapμΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€λ‘œλŠ” Hashtable, HashMap, LinkedHashMap, SortedMap, TreeMap 등이 μžˆλ‹€. β€» MapμΈν„°νŽ˜μ΄μŠ€μ—μ„œ κ°’(value)은 쀑볡을 ν—ˆμš©ν•˜κΈ° λ•Œλ¬Έμ— Collectionνƒ€μž…μœΌλ‘œ λ°˜ν™˜ν•˜κ³ , ν‚€(key)λŠ” 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— Setνƒ€μž…μœΌλ‘œ λ°˜ν™˜ν•œλ‹€.

Backend/Java

[Java] λžŒλ‹€μ‹(Lambda Expression)

* λ³Έ λ‚΄μš©μ€ 을 μ°Έκ³ ν•˜μ—¬ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ● λžŒλ‹€μ‹(Lambda Expression)은 λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ '식(expression)'으둜 ν‘œν˜„ν•œ 것이닀. λžŒλ‹€μ‹μ€ ν•¨μˆ˜λ₯Ό κ°„λž΅ν•˜λ©΄μ„œλ„ λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ν•  수 있게 ν•΄μ€€λ‹€. λ©”μ„œλ“œλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ λ©”μ„œλ“œμ˜ 이름과 λ°˜ν™˜κ°’μ΄ μ—†μ–΄μ§€λ―€λ‘œ, λžŒλ‹€μ‹μ„ '읡λͺ… ν•¨μˆ˜(anonymous function)'라고도 ν•œλ‹€. 즉, λžŒλ‹€μ‹μœΌλ‘œ 인해 λ©”μ„œλ“œλ₯Ό λ³€μˆ˜μ²˜λŸΌ λ‹€λ£¨λŠ” 것이 κ°€λŠ₯해진 것이닀. ● λžŒλ‹€μ‹ μž‘μ„±ν•˜κΈ° int max(int a, int b) { return a > b ? a : b; } λ©”μ„œλ“œμ—μ„œ 이름과 λ°˜ν™˜νƒ€μž…μ„ μ œκ±°ν•˜κ³  λ§€κ°œλ³€μˆ˜ 선언뢀와 λͺΈν†΅{} 사이에 '->'λ₯Ό μΆ”κ°€ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€. (int a, int b) -> { return a > b ? a : b; }..

Backend/Spring

[Spring] MVC(Model, View, Controller) 정리

● MVC(Model, View, Controller)λŠ” μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€, 데이터 및 논리 μ œμ–΄λ₯Ό κ΅¬ν˜„ν•˜λŠ” 데 널리 μ‚¬μš©λ˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄ λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€. μ†Œν”„νŠΈμ›¨μ–΄μ˜ λΉ„μ§€λ‹ˆμŠ€ 둜직과 화면을 κ΅¬λΆ„ν•˜λŠ”λ° 쀑점을 두고 μžˆμŠ΅λ‹ˆλ‹€. MVC의 λͺ©μ μ€ ν™”λ©΄κ³Ό 데이터 처리λ₯Ό 뢄리해 μ½”λ“œκ°„μ˜ 쒅속성을 쀄이고 κ΅¬μ„±μš”μ†Œκ°„μ˜ 역할을 λͺ…ν™•ν•˜κ²Œ ν•¨μœΌλ‘œμ¨ μ½”λ“œ 뢄리가 쉽고 ν˜‘μ—…μ„ μš©μ΄ν•˜κ²Œ ν•˜λŠ”λ° μžˆμŠ΅λ‹ˆλ‹€. ● λͺ¨λΈ(Model) μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 무엇을 ν•  것인지 μ •μ˜ν•œλ‹€. λ‚΄λΆ€ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 역할을 ν•œλ‹€. 즉, 데이터 μ €μž₯μ†Œ(ex. DB)와 μ—°λ™ν•˜μ—¬ μ‚¬μš©μžκ°€ μž…λ ₯ν•œ λ°μ΄ν„°λ‚˜ μ‚¬μš©μžμ—κ²Œ 좜λ ₯ν•  데이터λ₯Ό 닀룬닀. 특히, μ—¬λŸ¬ 개의 데이터 λ³€κ²½ μž‘μ—…(ex. μΆ”κ°€, λ³€κ²½, μ‚­μ œ)λ₯Ό ν•˜λ‚˜μ˜ μž‘μ—…μœΌλ‘œ 묢은 νŠΈλžœμž­μ…˜μ„ λ‹€λ£¨λŠ” ..

Backend/Spring

[Spring] IntelliJ ν”„λ‘œμ νŠΈ ν™˜κ²½ μ„€μ •

● μ€€λΉ„λ¬Ό JDK: Java 11 μ„€μΉ˜ IDE: IntelliJ μ„€μΉ˜ ● μŠ€ν”„λ§ ν”„λ‘œμ νŠΈ 생성 http://start.spring.io μ‚¬μ΄νŠΈλ‘œ μ΄λ™ν•˜μ—¬ ν”„λ‘œμ νŠΈ 생성(본인의 ν”„λ‘œμ νŠΈμ— 맞게 선택 ν›„ GENERATE 클릭) ● Open or Import Project IntelliJ IDEA μ‹€ν–‰ Open or Import 선택 압좕을 ν‘Ό 파일의 build.gradle 선택 Open as Project(생성) ● λ™μž‘ 확인 κΈ°λ³Έ 메인 클래슀 μ‹€ν–‰ μŠ€ν”„λ§ λΆ€νŠΈ 메인 μ‹€ν–‰ ν›„ μ—λŸ¬ νŽ˜μ΄μ§€λ‘œ κ°„λ‹¨ν•˜κ²Œ λ™μž‘ 확인(http://localhost:8080)

ν”„λ‘ νŠΈμ—”λ“œ μ—”μ§€λ‹ˆμ–΄
'Backend' μΉ΄ν…Œκ³ λ¦¬μ˜ κΈ€ λͺ©λ‘