Development

    @Transactional 어노테이션 해체 분해하기

    @Transactional 어노테이션 해체 분해하기

    최근 이벤트 리스너를 활용하면서, 트랜잭션 어노테이션에 깊게 공부할 기회가 생겼다.@Transactional(propagation = Propagation.REQUIRES_NEW)@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) 위와 같은 어노테이션을 사용했던 것인데, 무의식적으로 사용하다보니, 각 격리 수준이 무엇있고, 어떻게 동작하는지 자세히 뜯어보고 싶어서 나름 파고들어 공부해봤고, 그 내용을 정리하고자 한다.1. 트랜잭션 정의트랜잭션이란, 데이터베이스에서 하나의 논리적 작업을 '원자적으로 처리하기 위한 메커니즘'을 의미한다. 사실 정의라는게 아는 사람이 볼땐 이해가 잘되지만, 처음 접할때는 되게 멀게 느껴지는 그런게 있다. 그럴..

    테스트코드 내 StackOverflow 발생 원인과 해결 과정

    테스트코드 내 StackOverflow 발생 원인과 해결 과정

    1. 문제 발생서비스 레이어의 테스트 코드를 작성하고 실행했을 때, 예상치 못한 StackOverflowError가 발생했습니다.테스트 코드는 다음과 같았습니다.@ExtendWith(MockitoExtension::class)class BoardServiceTest { @Mock private lateinit var boardRepository: BoardRepository @Mock private lateinit var userRepository: UserRepository @Mock private lateinit var chatGptService: ChatGptService @Mock private lateinit var sessionUtil: Sessio..

    코틀린 - 함수형 프로그래밍에 대하여

    코틀린 - 함수형 프로그래밍에 대하여

    현재 "객체에서 함수로" 라는 책을 바탕으로 함수형 프로그래밍 스터디를 진행하고 있습니다.처음 함수형 프로그래밍을 접하면서 느꼈던 함수형 프로그래밍만의 매력을 복기하며 정리하고자 합니다. 0. 함수란?📌 수학적 관점함수는 수학에서 유래한 개념으로, 특정 입력을 받아 출력으로 변환하는 규칙입니다. 수학적 함수는 입력과 출력 사이의 명확한 관계를 정의하며, 외부 환경에 의존하거나 영향을 주지 않습니다.입력과 출력: 동일한 입력은 항상 동일한 출력 반환 (→ 순수성 / 순수 함수)독립성: 외부 상태나 변수에 의존하지 않음투명성: 함수 호출은 그 결과값으로 대체 가능 (→ 참조 투명성)f(x, y) = x + y f(2, 3) = 5항상 입력값 x=2, y=3에 대해 동일하게 5를 반환합니다. 💻 프로그래..

    JVM 밑바닥까지 파헤치기

    JVM 밑바닥까지 파헤치기

    JVM(Java Virtual Machine) 완벽 정리 🚀 1. JVM이란? JVM(Java Virtual Machine)은 자바 애플리케이션을 실행하기 위한 가상 머신입니다.개발자가 작성한 자바 코드는 바이트코드(Bytecode, .class 파일)로 변환된 후, JVM이 이를 실행합니다.JVM의 가장 큰 장점 중 하나는 운영체제(OS)에 종속되지 않는다는 것입니다.이는 자바의 “Write Once, Run Anywhere” 원칙을 가능하게 합니다. 💡 즉, 자바 프로그램이 어떤 운영체제에서든 실행될 수 있도록 해주는 역할을 합니다.2. JVM의 주요 기능 ① 바이트코드 실행 • 자바 컴파일러(javac)가 .java 파일을 .class 바이트코드 파일로 변환. • 클래스 로더에 의해 전달된 바이..

    자바 컴파일 과정

    자바 컴파일 과정

    자바(Java)의 컴파일 과정은 크게 4단계로 진행됩니다. 먼저 짚고 넘어가야할 것은, 자바는 JVM을 통해 OS에 독립적인 특징을 갖고 있다는 것입니다. 이는 즉 자바 코드가 컴파일되면 바로 CPU에서 읽히는 기계어로 변환되는 것이 아닌, 중간 역할을 하는 JVM을 거쳐야한다는 뜻이기도 합니다.1. 개발자의 자바 소스 코드 작성 (.java 파일)자바 프로그램은 .java 확장자를 가진 소스 코드 파일로 작성됩니다.흔히 우리가 작성하는 자바 코드를 의미합니다.public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); }} 2. 자바 컴파일러(Java Co..

    자바는 왜 객체지향 언어인가요?

    자바는 캡슐화,상속,추상화,다형성의 특징을 갖고 있기 때문입니다. 흔히 말하는 "캡상추다" 가 맞습니다. 1. 캡슐화(Encapsulation)객체 내부의 데이터(속성)는 private으로 숨기고, getter/setter 메서드를 통해 접근할 수 있습니다.이를 통해 데이터 보호와 정보 은닉이 가능하며, 유지보수가 쉬워집니다.public class Person { private String name; // 외부에서 직접 접근 불가 public String getName() { // 캡슐화를 통해 접근 return name; } public void setName(String name) { this.name = name; }} 2. 상속(Inherit..

    Boolean true == "true"가 가능할까요?

    Boolean true == "true"가 가능할까요?

    최근 제출을 목적으로 풀스택으로 웹 시스템을 개발했다. 그렇게 제출 2시간 전, 마지막 테스트를 하고 있던 와중, 어마어마한(?) 버그를 발견하게 되었다...... 바로 체크박스 check / uncheck가 ajax로 유지되지 않는다는 것...!원래는 잘 동작했던 기능이었기에, 도대체 뭐가 문제지 하고 식은땀이 주르르르르르르륵 났던 것 같다...결과적으론 버그를 찾아서 해결했지만,,정말 식겁한 순간이었던 것 같다...ㅠㅠㅠㅠㅠ 다시는 이런 문제를 일으키지 않기 위해 블로그에 가볍게 정리해보려고 한다. 1. 배경구현하고자한 내용을 간단히 설명하자면, 위 사진처럼 체크 박스 이벤트에 의해 DB에 체크여부를 저장하는 로직을 구현해야 했었다.체크를 클릭하면, DB에 is_checked 칼럼이 true, unc..

    스프링 빈이란??

    1. 스프링 빈? 정의(What?) IoC 컨테이너(스프링 컨테이너) 안에 들어있는 객체로, 필요 시 스프링 컨테이너에서 가져와서 사용한다. 싱글톤으로 저장되기 때문에 객체의 재사용이 가능하다. 왜써?(why?) 스프링 컨테이너에서 개발자 대신 객체를 관리하도록 하기 위함. 객체를 개발자가 직접 생성하고 관리하는 것이 아니라 스프링 컨테이너에 스프링 빈으로 등록하고 컨테이너가 연관관계를 맺고 관리하도록 할 수 있다. 스프링 빈을 등록하는 방법은 아래와 같다. 1. @Bean 어노테이션 + ComponentScan 어노테이션 @ComponentScan(basePackages= {"com.example.myapp"}) @ImportResource(value= {"classpath:application-con..