Dev/Java

Dev/Java

[Java] 직렬화, 역직렬화, 그리고 Getter

컨트롤러 응답을 이렇게 구현했다가 403 Forbidden이 발생해서 5시간 동안 삽질했다.더 부끄러운 건 로그를 제대로 안 봐서 이 사단이 만들어졌다는 거다.. 2024-05-23T01:55:58.686+09:00 WARN 60868 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation]HttpMediaTypeNotAcceptableException라고 명시되어 있는데 응답이 403 Forbidden라 권한 문제로 착각 + WARN 경고여서 그냥 넘겼다... 이렇게..

Dev/Java

[Java] Value Object와 Entity에 대한 소신 정리

한 명의 Member가 Account라는 객체를 가지도록 구현했는데 값 객체와 엔티티의 개념이 모호하여 정리하게 되었다. 아래는 기존 코드이다. 1️⃣ Member Entitypublic class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Valid @Embedded private Account account; @NotBlank private String nickname; private Role role; @Builder public Member(Account account, String nickname, Role role) { ..

Dev/Java

[Java] Random 클래스를 사용하면 안 되는 이유

닉네임 뒤에 난수 식별자 붙이는 기능을 구현하면서 늘 사용하던 Random 객체를 사용했다. 근데 어느 친절한 개발자 분께서 "Random 클래스"의 문제점이 뭐냐고 물어보셨다.네? Random class에 문제점이 있었나요? 바로 어떤 문제점이 있는지 찾아봤다.  1. 보안 Random 객체를 사용할 경우 생각보다 난수 같지 않은 난수를 얻는다(특징이 반복되는 난수들이 생성된다). 그래서 SecureRandom 객체를 사용해서 더 난수에 가까운 값을 만들 수 있다. 비교적 난수를 예측하기 쉬운 Random보다 SecureRandom 객체를 사용하는 것이 좋다.     라고 하면 좋겠지만 SecureRandom 객체 역시 사용하지 않는 게 좋다. 보안 목적을 떠나서 SecureRandom 객체 역시 Ra..

Dev/Java

[Java] 값 객체(Value Object)란 도대체 뭘까?

종종 무시되는 작은 객체들을 '값 객체'로 구현하면 풍부한 행동을 얻을 수 있다.- 마틴 파울러 값 객체란?객체지향 프로그래밍에서는 다양한 것들을 객체로 만들 수 있다. 객체로 만들 수 있는 것 중에 어떤 "값"도 포함된다. (ex. 잔고, 색상, 좌표 등) 자바가 제공하는 원시 데이터 타입을 사용해 개발할 수 있지만, 시스템 특유의 값을 정의해야 할 때가 분명 존재한다. 이때 정의하는 것이 값 객체이다.값 객체의 특징불변성교환등가성 1. 불변성값 객체의 상태를 수정할 때는 새로운 값을 대입한다. 이때 변하는 것은 값의 상태지, 값 자체가 수정되는 것은 아니다.예를 들어 Member 객체의 name의 상태가 Jiyoon에서 Yoonji로 바뀌었다. 이때 바뀐 것은 name이지, Member 자체가 아니..

Dev/Java

[Java] 필드 동기화로 인한 동시성 문제 해결하기 (by. ThreadLocal)

코드를 구현한 후 로그를 확인하기 위해 새로고침을 했다. 실수로 연속 두 번을 눌러버렸다.그랬더니 예상치 못한 결과가 출력되었다. 예상한 결과와 달리 순서가 뒤죽박죽 섞인 로그가 출력되었다. 심지어 다른 스레드인데 트랜잭션 ID가 일치한다. 대체 무슨 일이 생긴 걸까?  동시성 문제  동시성 문제가 일어나는 과정은 다음과 같다.1. 스레드 A가 서비스 객체에 접근하여 데이터를 저장하고 조회하려고 한다.2. 스레드 A가 서비스 객체에 접근하여 데이터를 저장했다.3. 스레드 A가 저장한 데이터를 조회하기 전에 스레드 B가 서비스 객체에 접근하여 데이터를 저장했다.4. 스레드 A는 본인이 저장한 데이터가 아닌, 스레드 B가 저장한 데이터를 조회한다.5. 스레드 B는 본인이 저장한 데이터를 조회한다. 🙋🏻‍..

Dev/Java

[Java] Web server failed to start. Port 5000 was already in use. (MacOS)

로컬에서 프로젝트를 빌드했는데 해당 에러가 떴다. 포트 문제인 것을 바로 알 수 있었다. 우리 프로젝트는 5000번 포트로 지정해 뒀기 때문에 5000번 포트가 이미 사용 중이니 삭제하라는 문장이다. 문제는 여기서부터였다.. 5000번 포트를 찾아내고 삭제해 주는데도 계속 자동으로 생성됐다.. 다행히 이 문제에 대한 원인도 바로 알 수 있었다. 맥북 포맷할 겸 몬터레이 OS에서 소노마 OS로 업그레이드했는데 그 과정에서 AirPlay 모드가 자동으로 켜진 것이다.. 해결 방법은 설정 > AirPlay 수신 모드 > AirPlay 수신 모드 해제 이렇게 설정해 주면 5000번 포트를 살릴 수 있다. 👍🏻👍🏻👍🏻

Dev/Java

[Java] Checked Exception vs. UnChecked Exception

Checked Exception (확인 예외) 잘못된 코드가 아닌 잘못된 상황에서 발생하는 예외 파일 열기와 같이 정확한 코드를 구현했음에도, 외부 환경(파일이 없는 상황 등)에 따라 발생 가능 예외처리를 구현하지 않으면 컴파일 에러 발생 RuntimeException 이외의 예외들 Unchecked Exception (미확인 예외) 런타임 시 잘못 구현된 코드로 인해 발생하는 예외 컴파일 에러가 나지 않지만 적절한 예외처리가 없을 경우 프로그램이 강제 종료 컴파일 시 확인하지 않기 때문에 미확인 얘외 RuntimeException 에 포함되는 예외들

Dev/Java

[Java] 얕은 복사 vs. 깊은 복사

얕은 복사로 객체를 넘겨주게 되면 주소를 공유하게 되어 실제값 변경에 영향을 미친다는 것을 알게 되었다. 이후 문제를 푸는 과정에서 객체를 반환할 때 list 대신 new ArrayList(list)를 반환하는 등 객체를 새로 생성해서 반환하도록 구현했다. 이번 기회에 얕은 복사가 일어나는 동작 원리에 궁금증이 생겨 두 복사의 차이점을 정리하고자 한다. 얕은 복사 (Shallow Copy) 먼저 테스트를 위해 학생 클래스를 만들어 주었다. 이름과 학년을 멤버 변수로 가지며, 이름과 학년을 변경할 수 있는 메서드를 가지고 있다. 학생 타입의 jiyoon 객체를 먼저 생성해준 뒤 copy에 jiyoon을 대입해 주어 얕은 복사를 진행하였다. 이후 copy를 통해 이름과 학년을 변경하면 어떻게 될까? jiyo..

yo0oni
'Dev/Java' 카테고리의 글 목록