Skip to content

Latest commit

ย 

History

66 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“– Semteul Battle Backend Convention

Semteul Battle์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ๋Œ€ํšŒ๋ฅผ ์šด์˜ํ•˜๊ณ  ์ฐธ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์›น ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” ๋Œ€ํšŒ์— ์ฐธ๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์ฝ”๋“œ๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ถœ์ œ์ž์™€ ๊ด€๋ฆฌ์ž๋Š” ๋Œ€ํšŒ, ๋ฌธ์ œ, ๊ณต์ง€์‚ฌํ•ญ, ์งˆ๋ฌธ ๊ฒŒ์‹œํŒ ๋“ฑ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“ฆ Package Structure

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ๋„๋ฉ”์ธ ์ค‘์‹ฌ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ(Domain-Oriented Package Structure) ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

src/main/java/Winter_Project/Semteul_Battle
โ”œโ”€โ”€ domain
โ”‚   โ”œโ”€โ”€ user
โ”‚   โ”œโ”€โ”€ contest
โ”‚   โ”œโ”€โ”€ problem
โ”‚   โ”œโ”€โ”€ menu
โ”‚   โ””โ”€โ”€ mail
โ””โ”€โ”€ global

๊ฐ ๋„๋ฉ”์ธ์€ ๋‹ค์Œ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

domain/{domain}
โ”œโ”€โ”€ controller
โ”œโ”€โ”€ service
โ”œโ”€โ”€ repository
โ”œโ”€โ”€ entity
โ”œโ”€โ”€ dto
โ”‚   โ”œโ”€โ”€ request
โ”‚   โ””โ”€โ”€ response
โ””โ”€โ”€ exception

๊ณตํ†ต ๊ธฐ๋Šฅ์€ global ํŒจํ‚ค์ง€์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

global
โ”œโ”€โ”€ config
โ”œโ”€โ”€ security
โ”œโ”€โ”€ exception
โ”œโ”€โ”€ response
โ”œโ”€โ”€ status
โ””โ”€โ”€ util

Package Rules

  • ๋„๋ฉ”์ธ ๊ด€๋ จ ์ฝ”๋“œ๋Š” domain/{domain} ๋‚ด๋ถ€์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ณตํ†ต ์ฝ”๋“œ๋Š” global์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • DTO๋Š” request, response๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • Entity๋ฅผ API ์‘๋‹ต์œผ๋กœ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋„๋ฉ”์ธ ์˜ˆ์™ธ๋Š” ๊ฐ ๋„๋ฉ”์ธ์˜ exception ํŒจํ‚ค์ง€์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ Naming Convention

Common Rules

๋Œ€์ƒ ๊ทœ์น™
Class PascalCase
Method camelCase
Variable camelCase
Constant UPPER_SNAKE_CASE
Package lowercase

Example

private static final long REFRESH_TOKEN_TTL_SECONDS = 604800L;

public void updateProfile(String profile) {
    this.profile = profile;
}

Class Naming

Type Convention Example
Controller {Domain}Controller UserController
Service {Domain}Service UserService
Service Impl {Domain}ServiceImpl UserServiceImpl
Repository {Entity}Repository UserRepository
Exception {Domain}Exception UserException
Request DTO {Action}RequestDto SignUpRequestDto
Response DTO {Data}ResponseDto UserResponseDto

Variable Naming

Rules

  • ๋‹จ์ผ ๊ฐ’์€ ์˜๋ฏธ๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ปฌ๋ ‰์…˜์€ ๋ณต์ˆ˜ํ˜•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ID๋Š” {domain}Id ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Boolean ๊ฐ’์€ is, has, can ์ ‘๋‘์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Example

Long userId;

List<Contest> contests;

boolean isChecked;
boolean hasPermission;

๐Ÿ› Entity Convention

Rules

  • @Setter, @Data ์‚ฌ์šฉ ๊ธˆ์ง€
  • ์ƒํƒœ ๋ณ€๊ฒฝ์€ ๋ช…์‹œ์ ์ธ ๋ฉ”์„œ๋“œ๋กœ ์ˆ˜ํ–‰
  • ์—ฐ๊ด€๊ด€๊ณ„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ LAZY
  • Entity๋ฅผ API ์‘๋‹ต์œผ๋กœ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ

Example

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;

public void updateName(String name) {
    this.name = name;
}

๐Ÿ“„ DTO Convention

Rules

  • ์š”์ฒญ DTO โ†’ dto.request
  • ์‘๋‹ต DTO โ†’ dto.response
  • ์š”์ฒญ DTO์—๋Š” Validation ์ ์šฉ
  • ๋ถˆํ•„์š”ํ•œ Setter ์‚ฌ์šฉ ์ง€์–‘
  • ์‘๋‹ต DTO๋Š” ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Example

@Getter
@NoArgsConstructor
public class SignUpRequestDto {

    @NotBlank
    private String loginId;

    @NotBlank
    private String password;
}

๐ŸŽฎ Controller Convention

Rules

  • ์š”์ฒญ ๊ฒ€์ฆ ๋‹ด๋‹น
  • ์‘๋‹ต ๋ฐ˜ํ™˜ ๋‹ด๋‹น
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ž‘์„ฑ ๊ธˆ์ง€
  • @Valid ์‚ฌ์šฉ
  • BaseResponse ํ˜•์‹์œผ๋กœ ์‘๋‹ต ํ†ต์ผ

Example

@PostMapping
public BaseResponse<Void> create(
        @RequestBody @Valid CreateRequestDto request
) {
    service.create(request);
    return BaseResponse.onSuccess(null);
}

โš™๏ธ Service Convention

Rules

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋‹ด๋‹น
  • Optional.get() ์‚ฌ์šฉ ๊ธˆ์ง€
  • orElseThrow() ์‚ฌ์šฉ
  • ์“ฐ๊ธฐ ์ž‘์—… โ†’ @Transactional
  • ์กฐํšŒ ์ž‘์—… โ†’ @Transactional(readOnly = true)
  • ๋„๋ฉ”์ธ ์˜ˆ์™ธ ์‚ฌ์šฉ

Example

User user = userRepository.findById(userId)
    .orElseThrow(() -> new UserException(ErrorStatus.NOT_FOUND));

๐Ÿ—„ Database Convention

Rules

  • ํ…Œ์ด๋ธ”๋ช…: snake_case
  • ์ปฌ๋Ÿผ๋ช…: snake_case
  • PK: id
  • FK: {table_name}_id
  • ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์€ Flyway๋กœ ๊ด€๋ฆฌ

Example

V1__init_schema.sql
V2__add_user_unique_constraints.sql

๐ŸŒฑ Git Convention

Branch Naming

type/short-description

Branch Types

Type Description
feat ๊ธฐ๋Šฅ ์ถ”๊ฐ€
fix ๋ฒ„๊ทธ ์ˆ˜์ •
refactor ๋ฆฌํŒฉํ† ๋ง
docs ๋ฌธ์„œ ์ˆ˜์ •
chore ์„ค์ • ๋ฐ ๊ธฐํƒ€ ์ž‘์—…
test ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
ci CI/CD ์„ค์ •

Example

feat/auth-sign-up
fix/token-refresh
refactor/entity-dto-cleanup
docs/readme-convention

Commit Message

type: ์ž‘์—… ๋‚ด์šฉ ์š”์•ฝ

Example

feat: ํšŒ์›๊ฐ€์ž… ์ด๋ฉ”์ผ ์ธ์ฆ ์ถ”๊ฐ€
fix: refresh token ๊ฒ€์ฆ ๋กœ์ง ์ˆ˜์ •
refactor: DTO setter ์ œ๊ฑฐ
docs: README ์ปจ๋ฒค์…˜ ์ถ”๊ฐ€

Pull Request

PR ์ œ๋ชฉ์€ Commit Message ํ˜•์‹์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

type: ์ž‘์—… ๋‚ด์šฉ ์š”์•ฝ

PR ๋ณธ๋ฌธ์€ ํ”„๋กœ์ ํŠธ PR ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ก API Response Convention

๋ชจ๋“  API ์‘๋‹ต์€ BaseResponse ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

{
  "isSuccess": true,
  "code": "COMMON200",
  "message": "์„ฑ๊ณต์ž…๋‹ˆ๋‹ค.",
  "result": {}
}

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages