๐Ÿ‘จโ€๐Ÿ’ป ์ฝ”๋“œ ์ปจ๋ฒค์…˜ ๊ฐœ๋ก  (์„ธ์…˜ ์ง„ํ–‰์šฉ)

devkev00ยท2024๋…„ 12์›” 30์ผ

๐Ÿ”ฅ What I've Learned

๋ชฉ๋ก ๋ณด๊ธฐ
4/9

๐Ÿง JAVA ์ฝ”๋“œ ์ปจ๋ฒค์…˜ ๊ฐœ๋ก 

๐Ÿ™‹ ์ฝ”๋“œ ์ปจ๋ฒค์…˜์ด ๋ญ์•ผ?

๐Ÿ™‹ ๊ผญ ํ•ด์•ผ ๋จ?

-> 1์ธ ๊ฐœ๋ฐœ์˜ ๊ฒฝ์šฐ๋Š” ์ƒ๊ด€์ด ์—†์–ด์š”
-> ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋ณดํ†ต ํ˜‘์—…์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‚จ์ด ์ง  ์ฝ”๋“œ๋ฅผ ๋‚ด๊ฐ€ ์ฝ์–ด์•ผ ํ•  ๋•Œ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ ์ •ํ•ด์ง„ ์ปจ๋ฒค์…˜์ด ์—†๋‹ค๋ฉด ์ถ”๊ฐ€์ ์ธ ์˜์‚ฌ์†Œํ†ต, ์†Œ์š” ์‹œ๊ฐ„์˜ ์ฆ๊ฐ€ ๋“ฑ ๋งŽ์€ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

ํ•œ๋ฒˆ ์ง์ ‘ ๋ด…์‹œ๋‹ค

โš ๏ธ ์ค„๋ฐ”๊ฟˆ, ๋“ค์—ฌ์“ฐ๊ธฐ, ์ค‘๊ด„ํ˜ธ ์–‘์‹ ๋“ฑ IDE๊ฐ€ ์ž๋™์œผ๋กœ ์ž˜ ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์€ ์ƒ๋žต

1. ์‹๋ณ„์ž์—๋Š” ์˜๋ฌธ/์ˆซ์ž/์–ธ๋”์Šค์ฝ”์–ด๋งŒ ํ—ˆ์šฉ

๋ณ€์ˆ˜๋ช…, ํด๋ž˜์Šค๋ช…, ๋ฉ”์„œ๋“œ๋ช… ๋“ฑ์—๋Š” ์˜์–ด์™€ ์ˆซ์ž๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ƒ์ˆ˜์—๋Š” ๋‹จ์–ด ์‚ฌ์ด์˜ ๊ตฌ๋ถ„์„ ์œ„ํ•˜์—ฌ ์–ธ๋”์Šค์ฝ”์–ด(_)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

// ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ:
// camelCase ์ ์šฉํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •
public class CodingMinsoo { } 
public void doSomethingMethod() { }
int userAge = 25;
String firstName = "Kim";
public static final int MAX_USER_COUNT = 100;
public static final String KINGGOD_URL = "www.google.com"

// ์ž˜๋ชป๋œ ์˜ˆ:
public class missileLaunch์‹œ์Šคํ…Œ๋ฌด { }  // ํ•œ๊ธ€ ์‚ฌ์šฉ
int ๋ช‡์‚ด = 25; // ํ•œ๊ธ€ ์‚ฌ์šฉ
String ๊ฑฐ์–ด๋ฐ๊น€์”น๋‹ˆ๊บผ = "Kim";  // ํ•œ๊ธ€ ์‚ฌ์šฉ
public static final int MaxUserCount = 100;  // ์–ธ๋”์Šค์ฝ”์–ด ๋ฏธ์‚ฌ์šฉ (PascalCase ์‚ฌ์šฉ)
public static final String kingGodUrl = "www.google.com" // ์นด๋ฉœ ์ผ€์ด์Šค ์‚ฌ์šฉ

2. ํ•œ๊ตญ์–ด ๋ฐœ์Œ๋Œ€๋กœ์˜ ํ‘œ๊ธฐ ๊ธˆ์ง€

์‹๋ณ„์ž์˜ ์ด๋ฆ„์„ ํ•œ๊ธ€ ๋ฐœ์Œ์„ ์˜์–ด๋กœ ์˜ฎ๊ฒจ์„œ ํ‘œ๊ธฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•œ๊ตญ์–ด ๊ณ ์œ ๋ช…์‚ฌ๋Š” ์˜ˆ์™ธ์ด๋‹ค.

// ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ
String address = "์ถฉ์ฒญ๋‚จ๋„ ์ฒœ์•ˆ์‹œ"

// ์ž˜๋ชป๋œ ์˜ˆ
String zipzuso = "์ถฉ์ฒญ๋‚จ๋„ ์ฒœ์•ˆ์‹œ"

3. ํŒจํ‚ค์ง€ ์ด๋ฆ„์€ ์†Œ๋ฌธ์ž๋กœ ๊ตฌ์„ฑ

package com.example.board
package com.example.member

4. ํด๋ž˜์Šค/์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์—๋Š” ํŒŒ์Šค์นผ ์ผ€์ด์Šค ์ ์šฉ

5. ํด๋ž˜์Šค ์ด๋ฆ„์— ๋ช…์‚ฌ ์‚ฌ์šฉ

ํด๋ž˜์Šค ์ด๋ฆ„์€ ํŒŒ์Šค์นผ ์ผ€์ด์Šค๋ฅผ ์ ์šฉํ•œ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ๋ช…์‚ฌ๋‚˜ ๋ช…์‚ฌ์ ˆ๋กœ ์ง“๋Š”๋‹ค.

public class MemberService {}

public class MemberReport {}

6. ๋ฉ”์„œ๋“œ ์ด๋ฆ„์— ์นด๋ฉœ์ผ€์ด์Šค ์ ์šฉ

๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์—๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ์–ด๋ฅผ ์†Œ๋ฌธ์ž๋กœ ์ž‘์„ฑํ•˜๊ณ , ์ด์–ด์ง€๋Š” ๋‹จ์–ด์˜ ์ฒซ ๊ธ€์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•˜๋Š” ์†Œ๋ฌธ์ž ์นด๋ฉœํ‘œ๊ธฐ๋ฒ•(Lower camel case)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์—์„œ๋Š” ์–ธ๋”์Šค์ฝ”์–ด๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค

isValidToken()

is_valid_token_test()

7. ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ ๋™์‚ฌ/์ „์น˜์‚ฌ๋กœ ์‹œ์ž‘

๋ฉ”์„œ๋“œ๋ช…์€ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋™์‚ฌ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ๋นŒ๋” ํŒจํ„ด์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์—๋Š” ์ „์น˜์‚ฌ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

bringMyMoney()
toString()

// ๋นŒ๋” ํŒจํ„ด ์˜ˆ์‹œ
public class CarBuilder {
    private String model;
    private String color;

    // ๋ชจ๋ธ์„ ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    public CarBuilder withModel(String model) {
        this.model = model;
        return this;
    }

    // ์ƒ‰์ƒ์„ ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    public CarBuilder withColor(String color) {
        this.color = color;
        return this;
    }

    // ์ž๋™์ฐจ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ
    public Car build() {
        return new Car(model, color);
    }
}

8. ์ƒ์ˆ˜๋Š” ๋Œ€๋ฌธ์ž์™€ ์–ธ๋”์Šค์ฝ”์–ด๋กœ ๊ตฌ์„ฑ

์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ์ž๋ฃŒํ˜•์ด๋ฉด์„œ static final๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ํ•„๋“œ์ผ ๋•Œ๋ฅผ ์ƒ์ˆ˜๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.

์ƒ์ˆ˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•˜๋ฉฐ, ๋ณตํ•ฉ์–ด๋Š” ์–ธ๋”์Šค์ฝ”์–ด(_)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์–ด๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

public final String SUCCESS_LOGIN = "๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜์˜€์Šต๋‹ˆ๋‹ค.";

9. ๋ณ€์ˆ˜์— ์นด๋ฉœ์ผ€์ด์Šค๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

๋ณดํ†ต ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋• ์ „์ฒด ์†Œ๋ฌธ์ž๋กœ ์„ ์–ธํ•œ๋‹ค.

int phonenumber = 01012345678

ํ•˜์ง€๋งŒ ์ƒ์ˆ˜๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜/์ง€์—ญ๋ณ€์ˆ˜/๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์—๋Š” ์†Œ๋ฌธ์ž ์นด๋ฉœํ‘œ๊ธฐ๋ฒ•(Lower camel case)์„ ์‚ฌ์šฉํ•œ๋‹ค.

public class Car {
    private String carModel;  
    private int carYear;  

10. ์ž„์‹œ ๋ณ€์ˆ˜ ์™ธ์—๋Š” 1๊ธ€์ž ์ด๋ฆ„ ์‚ฌ์šฉ ๊ธˆ์ง€

๋ฉ”์„œ๋“œ ๋ธ”๋Ÿญ ๋ฒ”์œ„ ์ด์ƒ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ๋ณ€์ˆ˜์—๋Š” 1๊ธ€์ž๋กœ ๋œ ์ด๋ฆ„์„ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

๋ฐ˜๋ณต๋ฌธ์˜ ์ธ๋ฑ์Šค๋‚˜ ๋žŒ๋‹ค ํ‘œํ˜„์‹์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ฑ ์งง์€ ๋ฒ”์œ„์˜ ์ž„์‹œ ๋ณ€์ˆ˜์—๋Š” ๊ด€๋ก€์ ์œผ๋กœ 1๊ธ€์ž ๋ณ€์ˆ˜๋ช…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

public class UserManager {
    private String userName;  
    // ๋ธ”๋Ÿญ ๋ฒ”์œ„ ์ด์ƒ์˜ ๋ณ€์ˆ˜์ด๋ฏ€๋กœ ๋ช…ํ™•ํ•œ ์ด๋ฆ„ ์‚ฌ์šฉ
    private int userAge;

    public void setUserName(String userName) {  
    // ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋„ ๋ช…ํ™•ํ•œ ์ด๋ฆ„ ์‚ฌ์šฉ
        this.userName = userName;
    }

    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }
}

public void printNumbers() {
    for (int i = 0; i < 10; i++) {  
    // ๋ฐ˜๋ณต๋ฌธ์˜ ์ธ๋ฑ์Šค๋Š” ๊ด€๋ก€์ ์œผ๋กœ 'i'๋ฅผ ์‚ฌ์šฉ
        System.out.println(i);
    }
}

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(n -> System.out.println(n));  
// ๋žŒ๋‹ค ํ‘œํ˜„์‹์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” 'n'๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ด๋ฆ„ ์‚ฌ์šฉ

11. static import์—๋งŒ ์™€์ผ๋“œ ์นด๋“œ ํ—ˆ์šฉ

ํด๋ž˜์Šค๋ฅผ importํ• ๋•Œ๋Š” ์™€์ผ๋“œ์นด๋“œ(*) ์—†์ด ๋ชจ๋“  ํด๋ž˜์Šค๋ช…์„ ๋‹ค ์“ด๋‹ค.

static import์—์„œ๋Š” ์™€์ผ๋“œ์นด๋“œ๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค.

-> ๋ณดํ†ต ํด๋ž˜์Šค๋ฅผ ๋จผ์ € ์ž…๋ ฅํ•˜๊ณ  InteliJ์˜ Import Class ๋‹จ์ถ•ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ์ง€์ผœ์ง€๋Š” ํŽธ

// ๋‚˜์œ ์˜ˆ
import java.util.*;

// ์ข‹์€ ์˜ˆ
import java.util.List;
import java.util.ArrayList;

12. ์–ด๋…ธํ…Œ์ด์…˜ ์„ ์–ธ ํ›„ ์ƒˆ ์ค„ ์‚ฌ์šฉ

ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž์— ๋ถ™๋Š” ์–ด๋…ธํ…Œ์ด์…˜์€ ์„ ์–ธ ํ›„ ์ƒˆ์ค„์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ด ์œ„์น˜์—์„œ๋„ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ์–ด๋…ธํ…Œ์ด์…˜ 1๊ฐœ๋Š” ๊ฐ™์€ ์ค„์— ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
-> ๊ทผ๋ฐ ๊ทธ๋ƒฅ ๋ฌด์กฐ๊ฑด ์–ด๋…ธํ…Œ์ด์…˜ ์„ ์–ธํ–ˆ์œผ๋ฉด ์ค„๋ฐ”๊ฟˆํ•˜๋Š”๊ฒŒ ๊ตญ๋ฃฐ์ž„ ใ……ใ„ฑ

@GetMapping("/api/board")
public void findById() {}

13. ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

ํ”„๋กœ์ ํŠธ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ๋˜ํ•œ ์ปจ๋ฒค์…˜์˜ ์ผ์ข…์ด๋‹ค.

ํฌ๊ฒŒ ๊ณ„์ธตํ˜•(Layered) ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์™€ ํŒจํ‚ค์ง€ํ˜•(Feature-based) ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋‹ค.

// ๊ณ„์ธตํ˜•
com
โ””โ”€โ”€ projectname
    โ”œโ”€โ”€ controller         
    โ”‚   โ””โ”€โ”€ UserController.java
    โ”‚   โ””โ”€โ”€ ProductController.java
    โ”œโ”€โ”€ service             
    โ”‚   โ””โ”€โ”€ UserService.java
    โ”‚   โ””โ”€โ”€ ProductService.java
    โ”œโ”€โ”€ repository         
    โ”‚   โ””โ”€โ”€ UserRepository.java
    โ”‚   โ””โ”€โ”€ ProductRepository.java
    โ”œโ”€โ”€ domain              
    โ”‚   โ””โ”€โ”€ User.java
    โ”‚   โ””โ”€โ”€ Product.java
    โ””โ”€โ”€ config              
        โ””โ”€โ”€ WebConfig.java
        โ””โ”€โ”€ AppConfig.java

๊ณ„์ธตํ˜•์€ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋ฅผ "์—ญํ• ์— ๋”ฐ๋ผ ๋‚˜๋ˆˆ ๊ฒƒ" ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
controller ํŒจํ‚ค์ง€์—๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€ ๋„๋ฉ”์ธ์˜ ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ชจ์•„๋†“๊ณ , service ํŒจํ‚ค์ง€์—๋Š” ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ ๋ชจ์•„๋†“๊ณ ,
repository ํŒจํ‚ค์ง€์—๋Š” ...

// ํŒจํ‚ค์ง€ํ˜•
com
โ””โ”€โ”€ projectname
    โ”œโ”€โ”€ user
    โ”‚   โ”œโ”€โ”€ UserController.java
    โ”‚   โ”œโ”€โ”€ UserService.java
    โ”‚   โ”œโ”€โ”€ UserRepository.java
    โ”‚   โ””โ”€โ”€ User.java
    โ”œโ”€โ”€ product
    โ”‚   โ”œโ”€โ”€ ProductController.java
    โ”‚   โ”œโ”€โ”€ ProductService.java
    โ”‚   โ”œโ”€โ”€ ProductRepository.java
    โ”‚   โ””โ”€โ”€ Product.java
    โ””โ”€โ”€ order
        โ”œโ”€โ”€ OrderController.java
        โ”œโ”€โ”€ OrderService.java
        โ”œโ”€โ”€ OrderRepository.java
        โ””โ”€โ”€ Order.java

ํŒจํ‚ค์ง€ํ˜•์€ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋ฅผ "๋„๋ฉ”์ธ(ํ˜น์€ ์—”ํ‹ฐํ‹ฐ)์— ๋”ฐ๋ผ ๋‚˜๋ˆˆ ๊ฒƒ" ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ํŒจํ‚ค์ง€๋กœ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— ๊ธฐ๋Šฅ์„ ๋„ฃ์–ด ๋†“๋Š”๋‹ค.

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์˜ ์„ ํƒ ๊ธฐ์ค€์€ ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ, ํŒ€ ์„ ํ˜ธ๋„, ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด์„ฑ ๋“ฑ์ด ์žˆ๋‹ค. ๋ณดํ†ต ๊ณ„์ธตํ˜•์€ ๋Œ€๊ทœ๋ชจ ํ”Œ์ ์— ์ ํ•ฉํ•˜๊ณ , ํŒจํ‚ค์ง€ํ˜•์€ ์ค‘์†Œ๊ทœ๋ชจ๋‚˜ ๋งˆ์ดํฌ๋กœ ์•„ํ‚คํ…์ณ์— ์ ํ•ฉํ•˜๋‹ค.

14. ์ •๋ฆฌ

์ฝ”๋“œ ์ปจ๋ฒค์…˜์€ ํ˜‘์—…์—์„œ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜์ด๋‹ค~~
๊ธ€๋กœ ์ •๋ฆฌํ•ด๋†“์œผ๋‹ˆ ๋„ˆ๋ฌด ๋งŽ๊ณ  ๋ณต์žกํ•ด๋ณด์ด์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ž‘์„ฑํ•˜๋‹ค๋ณด๋ฉด ์ €์ ˆ๋กœ ๋ชธ์— ๋ฐฐ๊ฒŒ ๋˜์–ด ์žˆ์œผ๋‹ˆ ๊ทธ๋ ‡๊ฒŒ ๊ฑฑ์ •ํ•˜์ง€ ๋ง์ž~!๐Ÿ˜

์ฐธ๊ณ :
๋Œ€๊ธฐ์—…, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ ์ปจ๋ฒค์…˜๋“ค
๋„ค์ด๋ฒ„
์˜ค๋ผํด

์ปจ๋ฒค์…˜ ์ค€์ˆ˜๋ฅผ ๋„์™€์ฃผ๋Š” extension๋“ค
Prettier <- ์ต์ˆ™ํ•˜๋‹ค ๊ทธ์ตธ
Linter

profile
Focusing on what I can change

0๊ฐœ์˜ ๋Œ“๊ธ€