JAVA로 개발하는 쇼핑몰 프로젝트 (JAVA VS KOTLIN)

2025. 2. 26. 19:34TIL

 

내가 KOTLIN을 공부하면서 가장 많이 들었던 말 중 하나는 JAVA 공부도 같이 병행하는것이 좋다! 라는 말이었다. 실제로 KOTLIN을 배우고 채용시장에 나가보니 KOTLIN보다는 JAVA의 채용공고가 대부분인것이 현실이었다. 물론 JAVA와 KOTLIN이 서로 호환이 되고 비슷한점도 많지만 KOTLIN뿐만 아니라 JAVA 개발에도 강점이 있다 라는 점을 어필하기 위해서 JAVA 프로젝트가 있는것이 좋겠다는 생각이 들어서 이 프로젝트를 시작하게 되었다.

 JAVA와 KOTLIN이 많이 유사하면서도 다른점이 많다고 알고있는데 이 차이를 피부로 직접 느낄수 있는 계기도 될것같아서 기대가 된다.

 

KOTLIN vs JAVA

Java 

@Configuration
public class SwaggerConfig {

    @Bean
    public OpenAPI openAPI() {
        return new OpenAPI()
                .addSecurityItem(new SecurityRequirement().addList("Bearer Authentication"))
                .components(new Components()
                        .addSecuritySchemes("Bearer Authentication", new SecurityScheme()
                                .type(SecurityScheme.Type.HTTP)
                                .scheme("bearer")
                                .bearerFormat("JWT")
                                .in(SecurityScheme.In.HEADER)
                                .name("Authorization")))
                .info(new Info()
                        .title("Shopping Mall  API")
                        .description("Shopping Mall API schema")
                        .version("1.0.0"));
    }
}

 

Kotlin

@Configuration
class SwaggerConfig {

    @Bean
    fun openAPI(): OpenAPI = OpenAPI()
        .addSecurityItem(
            SecurityRequirement().addList("Bearer Authentication")
        )
        .components(
            Components()
                .addSecuritySchemes(
                    "Bearer Authentication",
                    SecurityScheme()
                        .type(SecurityScheme.Type.HTTP)
                        .scheme("bearer")
                        .bearerFormat("JWT")
                        .`in`(SecurityScheme.In.HEADER)
                        .name("Authorization")
                )
        )
        .info(
            Info()
                .title("Shopping Mall API")
                .description("Shopping Mall API schema")
                .version("1.0.0")
        )
}

 

스웨거 관련 설정의 완벽히 동일한 코드에서도 JAVA와 KOTLIN의 차이를 알수 있다. 

KTOLIN에서는 public키워드를 선언하지 않아도 default로 선언이 되지만 JAVA에서는 명시를 해줘야한다는 것

KOTLIN에서는 new 키워드를 생략 하지만 JAVA에서는 명시를 해줘야한다는 것

 

Java

package hjp.shoppingmall.domain.member.service;

import hjp.shoppingmall.domain.member.dto.MemberRole;
import hjp.shoppingmall.domain.member.dto.SignUpDto;
import hjp.shoppingmall.domain.member.entity.MemberEntity;
import hjp.shoppingmall.domain.member.repository.MemberRepository;
import jakarta.transaction.Transactional;
import org.springframework.stereotype.Service;

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }

    @Transactional
    public String signUp(SignUpDto signUpDto){

        String loginId = signUpDto.getLoginId();
        String password = signUpDto.getPassword();
        String nickname = signUpDto.getNickname();
        boolean isMerchant = signUpDto.getIsMerchant();
        String memberRole = MemberRole.USER.toString();

        if(memberRepository.existsByLoginId(loginId)){
            throw new IllegalArgumentException("이미 존재하는 로그인 id 입니다.");
        }
        if(isMerchant) {
            memberRole = MemberRole.MERCHANT.toString();
        }

        memberRepository.save(new MemberEntity(loginId, password, nickname, memberRole));

        return "성공적으로 회원가입이 완료되었습니다!";
    }
}
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class SignUpDto {

    private String loginId;
    private String password;
    private String nickname;
    private Boolean isMerchant;
}

 

Kotlin

package hjp.nextil.domain.member.service

import hjp.nextil.domain.member.dto.SignUpDto
import hjp.nextil.domain.member.dto.TokenResponseDto
import hjp.nextil.domain.member.entity.MemberEntity
import hjp.nextil.domain.member.repository.MemberRepository
import hjp.nextil.security.jwt.JwtTokenManager
import org.springframework.stereotype.Service

@Service
class MemberService(
    private val memberRepository: MemberRepository,
    private val jwtTokenManager: JwtTokenManager,
) {
    fun signUp(signUpDto: SignUpDto) {
        val check = memberRepository.existsByUserName(signUpDto.userName)
        if(!check){
            memberRepository.save(
                MemberEntity(
                    userName = signUpDto.userName,
                    password = signUpDto.password,
                )
            )
        }
        else{
            throw IllegalArgumentException("userName already exists")
        }
    }
}
package hjp.nextil.domain.member.dto

data class SignUpDto(
    val userName: String,
    val password: String,
)

 

Kotlin에서는 data class를 이용해서 getter, setter, equals(), hashCode(), toString(), copy() 같은 메소드들을 자동으로 생성해주지만 Java에서는 따로 명시를 해줘야한다.( Lombok 라이브러리를 사용하면 유사한 기능을 제공할수 있음 )

'TIL' 카테고리의 다른 글

𝒍𝒐𝒎𝒃𝒐𝒌  (0) 2025.02.28
JWT Claims instance is immutable and may not be modified. 오류 해결  (1) 2025.02.27
HTTP/3 VS HTTP/2  (0) 2025.02.25
OPEN AI를 이용한 TIL 추천 서비스 NEXTIL  (0) 2025.02.24
Jsoup + Open AI  (0) 2025.02.21