Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
129 commits
Select commit Hold shift + click to select a range
a14513a
chore: Update README.md
dbfgml2000 Sep 18, 2025
6733cdb
[feat] SpringDoc 설정 (#13)
dbfgml2000 Sep 19, 2025
f836b54
feat:addrefreshtoken
dooongdaeng Sep 19, 2025
c53476c
fix:충돌해결
dooongdaeng Sep 19, 2025
6e489a9
feat:entityã…생성
dooongdaeng Sep 19, 2025
54f0cb5
Test:AuthTokenServiceTest
dooongdaeng Sep 19, 2025
cdc0a86
feat:회원가입시 역할 나누기
dooongdaeng Sep 19, 2025
a486721
refactor:idType
dooongdaeng Sep 19, 2025
2335aeb
Merge branch 'main' of https://github.com/prgrms-web-devcourse-final-…
dooongdaeng Sep 19, 2025
00fc988
Merge branch 'refactor#17' into develop
dooongdaeng Sep 19, 2025
6f7fdb6
Feat : Comment, News 엔티티 작성.
tlswltjq Sep 19, 2025
6be1cd9
Feat : likes필드 추가
tlswltjq Sep 19, 2025
01a5591
Feat : Video 작성 및 News 와 연관관계 매핑
tlswltjq Sep 19, 2025
75eb051
Feat : 비디오 픽스쳐 메소드 작성
tlswltjq Sep 19, 2025
69583cb
Test : News 도메인 테스트 추가
tlswltjq Sep 19, 2025
76a8e17
Refactor : 생성자를 통해 초기화되도록 수정
tlswltjq Sep 19, 2025
5e5dfcb
Feat : News의 유효성 검증 로직 추가
tlswltjq Sep 19, 2025
74fbd3d
Test : 테스트 추가
tlswltjq Sep 19, 2025
22c8e39
Test : 생성 테스트가 코멘트 리스트 크기를 체크
tlswltjq Sep 19, 2025
e6e9571
Fix : 생성자를 통해 코멘트 리스트를 초기화하도록 수정
tlswltjq Sep 19, 2025
56930e7
Feat : News와 Member가 연관관계를 맺도록 매핑
tlswltjq Sep 19, 2025
9ab5c6b
Feat : Member 픽스쳐 메소드 작성
tlswltjq Sep 19, 2025
5591ed1
Test : Member 연관관계 매핑에 따른 테스트케이스 추가 및 수정
tlswltjq Sep 19, 2025
3dce02e
Feat : News 픽스쳐 메소드 작성
tlswltjq Sep 19, 2025
cbf817f
Feat : Comment 유효성 검증 로직 추가
tlswltjq Sep 19, 2025
4526c33
Test : 테스트 추가
tlswltjq Sep 19, 2025
b73f3ec
Feat : Video 유효성 검증 로직 추가
tlswltjq Sep 19, 2025
a2571e9
Chore : 패키지 위치 변경
tlswltjq Sep 19, 2025
cb6fb24
Test : 테스트 추가
tlswltjq Sep 19, 2025
c3eda5c
Feat : News 도메인 Repository, Service 작성
tlswltjq Sep 19, 2025
7f90734
Feat : Like 엔티티 작성
tlswltjq Sep 19, 2025
05f6696
Feat : 좋아요 집계를 정수가 아닌 Like 엔티티로 변경, 메서드 추가
tlswltjq Sep 19, 2025
2abbb55
Feat : 메서드 추가
tlswltjq Sep 19, 2025
1e758ef
Fix : News에서 추가되도록 수정
tlswltjq Sep 19, 2025
ace6d2d
Fix : News에서 추가되도록 수정
tlswltjq Sep 19, 2025
1e1150d
Chore : 메모
tlswltjq Sep 19, 2025
469bb0d
Test : 테스트 추가
tlswltjq Sep 19, 2025
c61a7d7
Fix : News엔티티를 통해 삭제하도록 수정
tlswltjq Sep 19, 2025
a7e10d2
Test : 테스트 추가
tlswltjq Sep 19, 2025
dafa8c7
Feat : file 도메인 Service, Repository 작성
tlswltjq Sep 19, 2025
f330c67
Feat : comment 도메인 Service, Repository 작성
tlswltjq Sep 19, 2025
d46cc13
Feat : Like 도메인 Service, Repository 작성
tlswltjq Sep 19, 2025
3aa9157
Feat : NewsService 작성
tlswltjq Sep 19, 2025
48abe96
Feat : News로부터 Comment접근 가능하기떄문에 굳이 작성 안해도 될 것 같다, 다만 컨트롤러는 분리하는것이 좋다…
tlswltjq Sep 19, 2025
003d85c
Feat : JpaRepository 상속받도록함
tlswltjq Sep 19, 2025
e42c0da
chore: 멘토링 관련 엔티티 생성
sso0om Sep 19, 2025
4f4a7e5
chore: 멘토링 관련 레파지토리 생성
sso0om Sep 19, 2025
4d09fb5
Merge pull request #20 from prgrms-web-devcourse-final-project/chore#12
sso0om Sep 19, 2025
68b8c59
Feat : S3 사용전 모킹을 위한 MiniO
tlswltjq Sep 19, 2025
a272231
Merge branch 'develop' of https://github.com/prgrms-web-devcourse-fin…
dooongdaeng Sep 19, 2025
6d3e75d
Feat : 파일 다운로드를 위한 설정 및 메서드 작성
tlswltjq Sep 19, 2025
a063cfa
feat: 로드맵 도메인 엔티티 구현 (#21)
dbfgml2000 Sep 19, 2025
20726d1
Feat : 메타데이터 저장할 메서드 createVideo,
tlswltjq Sep 20, 2025
48e2fc4
Feat : 메서드 추가
tlswltjq Sep 20, 2025
5b8349f
Feat : news 생성 엔드포인트 작성
tlswltjq Sep 20, 2025
49fda98
Feat : 코멘트 컨트롤러 생성
tlswltjq Sep 20, 2025
62d1b39
Feat : 메서드 오버로딩
tlswltjq Sep 21, 2025
9cc02db
Feat : 예외처리
tlswltjq Sep 22, 2025
d11dd01
Feat : HEAD요청을 통해 객체 존재하는지 미리 확인
tlswltjq Sep 22, 2025
f5312af
Test : 테스트 추가
tlswltjq Sep 22, 2025
6e0ca1e
Feat : Like 서비스, 레포지토리 작성
tlswltjq Sep 22, 2025
fcbba80
Feat : News단건, 다건조회 엔드포인트 작성
tlswltjq Sep 22, 2025
dcd4ede
Test : Like 테스트 작성
tlswltjq Sep 22, 2025
92a0e65
Feat : 좋아요기능 작성
tlswltjq Sep 22, 2025
cc542d6
Fix : 타입 수정
tlswltjq Sep 22, 2025
e8afed8
Fix : 타입 수정
tlswltjq Sep 22, 2025
d24fefd
Fix : 타입 수정
tlswltjq Sep 22, 2025
3ca1a80
Test : 테스트 추가
tlswltjq Sep 22, 2025
16435b7
Feat : 반환타입 변경
tlswltjq Sep 22, 2025
3608bfe
게시글 조회 메소드 작성
luckhee Sep 19, 2025
847d70a
@Currentuser 커스텀 어노테이션 제작
luckhee Sep 19, 2025
ee0383a
log 추가
luckhee Sep 19, 2025
c8a703c
postType 에러 TC 작성 완료
luckhee Sep 22, 2025
416b68b
PostSingleResponseDto 작성
luckhee Sep 22, 2025
5223460
Feat : 좋아요수 반환하는 메서드 추가
tlswltjq Sep 22, 2025
2f9927b
Feat : 좋아요 엔드포인트 작성
tlswltjq Sep 22, 2025
dca4ea2
Feat : PresignedURL 발급 엔드포인트 작성
tlswltjq Sep 22, 2025
4247077
Merge pull request #23 from prgrms-web-devcourse-final-project/feat#10
luckhee Sep 22, 2025
0cc0bfc
Refactor : 메서드명 변경
tlswltjq Sep 22, 2025
e995ded
FIX : 반환타입 변경
tlswltjq Sep 22, 2025
a370d78
Feat : 뉴스 수정 엔드포인트 작성
tlswltjq Sep 22, 2025
d7c8dc6
Feat : 뉴스 삭제 엔드포인트 작성
tlswltjq Sep 22, 2025
194428d
feat:회원가입기본
dooongdaeng Sep 22, 2025
789bcec
Feat : 커밋 누락
tlswltjq Sep 22, 2025
1049cd5
feat:비밀번호 암호화
dooongdaeng Sep 22, 2025
1f091d5
Feat : Comment 서비스/레포지토리 작성
tlswltjq Sep 22, 2025
05ecb4c
Feat/Test : Comment 엔드포인트, 테스트 추가
tlswltjq Sep 22, 2025
6bbec08
Feat/Test : 수정, 삭제 요청시 삭제하려는 댓글이 뉴스의 것이 맞는지 확인
tlswltjq Sep 22, 2025
5315f04
Chore : work
tlswltjq Sep 22, 2025
6d74ca4
Merge pull request #25 from prgrms-web-devcourse-final-project/feat/3
tlswltjq Sep 22, 2025
8ed5265
Fix : PathVariable value값 명시적으로 표시
tlswltjq Sep 23, 2025
4029878
Fix : PathVariable value값 명시적으로 표시
tlswltjq Sep 23, 2025
7f90549
feat:이메일 인증 테스트
dooongdaeng Sep 23, 2025
deee49c
refactor:리팩토링
dooongdaeng Sep 23, 2025
2319b05
Merge branch 'feat#16' into develop
dooongdaeng Sep 23, 2025
7956fcf
Fix : NoSuchElementException를 던져 전역예외처리기에서 404를 반환하도록 변경
tlswltjq Sep 23, 2025
cd810e2
Fix : NoSuchElementException를 던져 전역예외처리기에서 404를 반환하도록 변경
tlswltjq Sep 23, 2025
9465876
Feat : 예외처리
tlswltjq Sep 23, 2025
7886c87
Feat : 적절한 예외를 반환하도록 변경
tlswltjq Sep 23, 2025
397b339
Feat : 적절한 예외를 반환하도록 변경
tlswltjq Sep 23, 2025
c77b1e9
Fix : News엔티티를 조회할 때 Member도 함께 조회
tlswltjq Sep 23, 2025
49be60d
Merge pull request #30 from prgrms-web-devcourse-final-project/fix/28
tlswltjq Sep 23, 2025
72854a5
fix:rq.getActor()에 ê°role추가
dooongdaeng Sep 23, 2025
e40dffa
Merge branch 'fix/29' into develop
dooongdaeng Sep 23, 2025
c4bd2e9
rename: 멘토링레파지토리로 명칭 변경
sso0om Sep 22, 2025
23e9262
feat: JSON 태그를 List<String>으로 변환하는 컨버터 추가
sso0om Sep 22, 2025
1a43a9b
refactor: Json List 변환 로직 Ut.json로 추출
sso0om Sep 22, 2025
6a07471
feat: ErrorCode 인터페이스 추가
sso0om Sep 22, 2025
24958cc
feat: AccessDeniedException 핸들러 추가
sso0om Sep 22, 2025
6cf2046
feat: member fixture 생성
sso0om Sep 22, 2025
4d10868
feat: mentoring fixture 생성
sso0om Sep 22, 2025
e5cd806
feat: 멘토링 생성
sso0om Sep 22, 2025
763989b
feat: 멘토링 수정
sso0om Sep 22, 2025
a5a86bf
feat: 멘토링
sso0om Sep 23, 2025
4dc25e4
feat: 멘토링 조회
sso0om Sep 23, 2025
8380d03
feat: 멘토링 목록 조회(페이징)
sso0om Sep 23, 2025
262de87
feat: 멘토 검색
sso0om Sep 23, 2025
b5b5a5d
feat: 멘토링 검색
sso0om Sep 23, 2025
1db8347
Merge pull request #32 from prgrms-web-devcourse-final-project/feat#18
sso0om Sep 23, 2025
bb0b032
test:로그인, 로그아웃 관련 테스트
dooongdaeng Sep 23, 2025
603e3ff
fix:redis관련 오류 일단 안보이게
dooongdaeng Sep 23, 2025
a0cc1d6
Merge branch 'feat/31' into develop
dooongdaeng Sep 23, 2025
2e2c1ca
게시글 다건 조회 && 단건조회 TC 작성 && Init 데이터 설정
luckhee Sep 22, 2025
e541388
게시글 생성 유효성관련 테스트코드 추가
luckhee Sep 22, 2025
abcdb81
타입 별 저장 위치 분류
luckhee Sep 22, 2025
0ff4473
Post 엔티티 관련 리팩토링
luckhee Sep 23, 2025
5f948b3
게시글 삭제 기능 구현 완료
luckhee Sep 23, 2025
bf0d3fb
게시글 좋아요 싫어요 기능 구현 완료
luckhee Sep 23, 2025
2f9eed9
게시글 댓글 생성 기능 구현
luckhee Sep 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,10 @@ out/
CLAUDE.md
db_dev.mv.db
db_dev.trace.db

cookies.txt

.DS_Store

### QueryDSL Q클래스 ###
**/generated/
2 changes: 1 addition & 1 deletion back/.env.default
Original file line number Diff line number Diff line change
@@ -1 +1 @@
CUSTOM__JWT__SECRET_KEY=NEED_TO_SET
CUSTOM__JWT__SECRET_KEY=abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789
32 changes: 29 additions & 3 deletions back/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import org.gradle.kotlin.dsl.implementation

plugins {
java
id("org.springframework.boot") version "3.5.5"
id("io.spring.dependency-management") version "1.1.7"
}

group = "com.ll"
group = "com"
version = "0.0.1-SNAPSHOT"
description = "back"

Expand All @@ -25,21 +27,45 @@ repositories {
}

dependencies {
// JWT
implementation("io.jsonwebtoken:jjwt-api:0.12.6")
runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.6")
runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.6")

// Swagger
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.9")
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.13")

// Spring Boot
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation ("org.springframework.boot:spring-boot-starter-data-redis")

// QueryDSL
implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta")
annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jakarta")
annotationProcessor("jakarta.persistence:jakarta.persistence-api:3.1.0")
annotationProcessor("jakarta.annotation:jakarta.annotation-api:2.1.1")

// Lombok
compileOnly("org.projectlombok:lombok")
developmentOnly("org.springframework.boot:spring-boot-devtools")
runtimeOnly("com.h2database:h2")
annotationProcessor("org.projectlombok:lombok")

// DB
runtimeOnly("com.h2database:h2")
runtimeOnly("com.mysql:mysql-connector-j")

// DevTools
developmentOnly("org.springframework.boot:spring-boot-devtools")

// Test
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.security:spring-security-test")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")

implementation ("software.amazon.awssdk:s3:2.25.0")
}

tasks.withType<Test> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.back.domain.file.controller;

import com.back.domain.file.service.VideoService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.net.URL;
import java.util.List;
import java.util.Map;

@RestController
@RequiredArgsConstructor
public class VideoController {

private final VideoService videoService;

// 업로드용 Presigned URL
@GetMapping("/videos/upload-url")
public URL getUploadUrl(@RequestParam String fileName) {
return videoService.generateUploadUrl("test-bucket", fileName);
}

// DASH 스트리밍용 URL
@GetMapping("/videos/dash-urls")
public Map<String, URL> getDashUrls(
@RequestParam String mpdFile,
@RequestParam List<String> segmentFiles
) {
return videoService.generateDashUrls("test-bucket", mpdFile, segmentFiles);
}
}
66 changes: 66 additions & 0 deletions back/src/main/java/com/back/domain/file/entity/Video.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.back.domain.file.entity;

import com.back.global.jpa.BaseEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;

@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Video extends BaseEntity {
@Column(unique = true)
private String uuid;

@JdbcTypeCode(SqlTypes.JSON)
@Column(name = "transcoding_results")
private String transcodingResults;

private String originalPath;

private Integer views;

private String originalFileName;

private Integer duration;

private Long fileSize;

@Builder(access = AccessLevel.PRIVATE)
private Video(String uuid, String transcodingResults, String originalPath, Integer views, String originalFileName, Integer duration, Long fileSize) {
this.uuid = uuid;
this.transcodingResults = transcodingResults;
this.originalPath = originalPath;
this.views = views;
this.originalFileName = originalFileName;
this.duration = duration;
this.fileSize = fileSize;
}

public static Video create(String uuid, String transcodingResults, String originalPath, String originalFileName, Integer duration, Long fileSize) {
if (uuid == null || uuid.isBlank()) {
throw new IllegalArgumentException("uuid cannot be null or empty");
}
if (originalPath == null || originalPath.isBlank()) {
throw new IllegalArgumentException("originalPath cannot be null or empty");
}
if (originalFileName == null || originalFileName.isBlank()) {
throw new IllegalArgumentException("originalFileName cannot be null or empty");
}

return Video.builder()
.uuid(uuid)
.transcodingResults(transcodingResults)
.originalPath(originalPath)
.views(0)
.originalFileName(originalFileName)
.duration(duration)
.fileSize(fileSize)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.back.domain.file.repository;

import com.back.domain.file.entity.Video;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface VideoRepository extends JpaRepository<Video, Integer> {
Optional<Video> findByUuid(String uuid);
}
116 changes: 116 additions & 0 deletions back/src/main/java/com/back/domain/file/service/VideoService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package com.back.domain.file.service;

import com.back.domain.file.entity.Video;
import com.back.domain.file.repository.VideoRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.HeadObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest;

import java.net.URL;
import java.time.Duration;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.UUID;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class VideoService {
private final VideoRepository videoRepository;
private final S3Presigner presigner;
private final S3Client s3Client;

public Video createVideo(String transcodingStatus, String originalPath, String originalFilename, Integer duration, Long fileSize) {
String uuid = UUID.randomUUID().toString();
Video video = Video.create(uuid, transcodingStatus, originalPath, originalFilename, duration, fileSize);
return videoRepository.save(video);
}

public Video getNewsByUuid(String uuid) {
return videoRepository.findByUuid(uuid)
.orElseThrow(() -> new NoSuchElementException("존재하지 않는 비디오입니다."));
}

//HeadObjectRequest 고려
public URL generateUploadUrl(String bucket, String objectKey) {
if(!isExist(bucket, objectKey)){
throw new NoSuchElementException("요청한 파일이 존재하지 않습니다: " + objectKey);
}

PutObjectRequest request = PutObjectRequest.builder()
.bucket(bucket)
.key(objectKey)
.build();

PresignedPutObjectRequest presignedRequest =
presigner.presignPutObject(builder -> builder
.signatureDuration(Duration.ofMinutes(30))
.putObjectRequest(request));

URL url = presignedRequest.url();
if (url == null) {
throw new RuntimeException("Presigned URL 생성 실패");
}

return url;
}

public URL generateDownloadUrl(String bucket, String objectKey) {
if(!isExist(bucket, objectKey)){
throw new NoSuchElementException("요청한 파일이 존재하지 않습니다: " + objectKey);
}

GetObjectRequest request = GetObjectRequest.builder()
.bucket(bucket)
.key(objectKey)
.build();

PresignedGetObjectRequest presignedRequest =
presigner.presignGetObject(builder -> builder
.signatureDuration(Duration.ofHours(1))
.getObjectRequest(request));

URL url = presignedRequest.url();
if (url == null) {
throw new RuntimeException("Presigned URL 생성 실패");
}

return url;
}

// DASH용 인덱스 + 세그먼트 URL 발급
public Map<String, URL> generateDashUrls(String bucket, String mpdFile, List<String> segmentFiles) {
// MPD 파일 URL
URL mpdUrl = generateDownloadUrl(bucket, mpdFile);

// 각 세그먼트 파일 URL
Map<String, URL> segmentUrls = segmentFiles.stream()
.collect(Collectors.toMap(f -> f, f -> generateDownloadUrl(bucket, f)));

// MPD 포함 합쳐서 반환
segmentUrls.put("mpd", mpdUrl);
return segmentUrls;
}

public boolean isExist(String bucket, String objectKey) {
try {
HeadObjectRequest headRequest = HeadObjectRequest.builder()
.bucket(bucket)
.key(objectKey)
.build();

s3Client.headObject(headRequest);
return true;
} catch (S3Exception e) {
return false;
}
}
}
34 changes: 34 additions & 0 deletions back/src/main/java/com/back/domain/job/job/entity/Job.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.back.domain.job.job.entity;

import com.back.global.jpa.BaseEntity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.List;

@Entity
@Table(name = "job")
@Getter @Setter
@NoArgsConstructor
public class Job extends BaseEntity {
@Column(name = "name", nullable = false, unique = true)
private String name;

@Column(name = "description", columnDefinition = "TEXT")
private String description;

@OneToMany(mappedBy = "job", cascade = CascadeType.ALL)
private List<JobAlias> aliases;

public Job(String name, String description) {
this.name = name;
this.description = description;
}

public void addAlias(JobAlias alias) {
aliases.add(alias);
alias.setJob(this);
}
}
25 changes: 25 additions & 0 deletions back/src/main/java/com/back/domain/job/job/entity/JobAlias.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.back.domain.job.job.entity;

import com.back.global.jpa.BaseEntity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Table(name = "job_alias")
@Getter @Setter
@NoArgsConstructor
public class JobAlias extends BaseEntity {
@Column(name = "name", nullable = false)
private String name; // 사용자가 입력한 직군 이름

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "job_id")
private Job job; // 표준 Job 연결 (NULL이면 pending 상태)

public JobAlias(String name) {
this.name = name;
this.job = null; // 기본적으로 연결된 Job이 없음 (pending 상태)
}
}
Loading