벌써
12월 3일이고...
11월은 어찌 보냈냐..


캘린더를 보니까
운동을 많이 하고 보냈네

11월 서핑을 처음 했는데
그것도 연속 2주를 갔다

이때가 너무 좋아서
다음주에 파도 좋대서 또갔다



맨날 고성만 가다가
남애3리는 올해 처음 이었다


올해는 서핑이 좀 재밌어지고
많이 늘었다 🌊🏄🏽‍♀️🌊




새로운 만남도 있었지만
인연이 아니었다
아쉬웠다

내 인연은
어딘가에 있겠지?

이렇게 치열하게 고민한 끝에
만난 인연은 어떤 인연일까..

과연 있기는 한걸까..

책도 생각해보니 많이 읽었다

여행의 이유를 다읽었고
렛뎀을 읽기 시작했다

요리도 예전보다 많이 하고있다


올해 첫 방어


술도 만취할 정도로 두번정도 마셨다..
한번은 친한 사람들과
한번은 혼자서

속상했다

11월은
신인감독 김연경을 보고
일도 열심히 하려고 노력했다
주말 출근도 했고
(근데 왜이리 진도는 안나갈까ㅜㅜ)

하이록스 대회도 나가고
돌이켜보니

열심히 살았네?

칭찬한다

재밌었던 하이퍼 피트니스 게임즈



10월에 10키로 마라톤
11월에 하이록스
를 나가고 준비하다보니

살도 조금 빠졌다..
(기쁨)
아무래도 운동을 더 열심히 하게된다

대회는 종종 이거저거
나가보는게 나한테 좋은거 같다 ㅎㅎ
앞으로도 종종 나가야지

11월은 다양하게 내가 성장되는 시간
이었던거 같다

일도 좀 내거 열심히 해야겠다 생각해서
주인의식을 가지고 했고

운동도 크로스핏을 평소보다 더 나갔고
살도 빠졌고
책도 읽었고

생각해보니 일기도 많이 썼다

그리고 좀 내버려두기도 연습을 했다
아직 완벽하진 않지만

그래서 그런지
아니 인연이 아니어서
마음이 좀 지친듯 하다

그리고 연말이 다가오니
또 한해가 가는구나 하는
마음이 들어 좀 씁쓸하기도 하다

그런데 어쩌겠는가
그래도 이렇게 회고를 하니
11월 한달 내가 열심히 살았구나
느껴지고
앞으로도 이렇게
살고 나를 도닥이고
내 인연이 언젠간 나타날 것임을
믿고 기다려보자

혼자서도 행복해야
둘이서도 행복하니까

다시 혼자서도 행복해보자




1. @Mock (Mockito)

  • 역할: 해당 타입의 "가짜(mock) 객체"를 만들어줌.
  • 특징:
    • 모든 메서드는 기본적으로 아무 행동도 하지 않음(return null/0/false 등)
    • 원하는 동작을 when(...).thenReturn(...) 등으로 지정해야 함.
  • 용도:
    • 테스트 대상 객체의 의존성(필드/파라미터 등)에 가짜 객체를 주입하고 싶을 때
  • 예시:
    @Mock MyService service; // 진짜 MyService가 아니라, mock이 들어감

2. @Spy (Mockito)

  • 역할: 실제 객체를 생성해서 감시(spy)함.
  • 특징:
    • 진짜 객체의 동작을 유지하면서, 일부 메서드만 mock처럼 지정 가능
    • 원하는 동작을 doReturn(...).when(spy).method(...) 등으로 오버라이드 가능
  • 용도:
    • 진짜 객체의 일부만 mock 처리하고 나머지는 실제 동작하도록 할 때
  • 예시:
    @Spy List<String> list = new ArrayList<>(); // list.add() 등 실제 동작, 일부 메서드만 mock 가능

3. @InjectMocks (Mockito)

  • 역할:
    • 해당 객체를 "진짜로" 생성하고,
    • @Mock/@Spy 등으로 만든 객체들을 자동으로 필드/생성자/Setter에 주입해줌
  • 특징:
    • 테스트 대상 객체를 만들 때, 의존성을 자동 주입해줌
  • 용도:
    • 테스트 대상 객체(핸들러, 서비스 등)와 그 의존성(mock/spies)을 조합할 때
  • 예시:
    @InjectMocks MyHandler handler; @Mock MyService service; // handler.service에 mock service가 주입됨

4. @MockBean (Spring Boot Test)

  • 역할:
    • Spring 컨테이너에 해당 타입의 mock 객체를 빈으로 등록
  • 특징:
    • 실제 @Autowired 등에서 mock 객체가 주입됨 (스프링 컨텍스트용)
    • 스프링이 관리하는 빈을 테스트에서 대체할 때 사용
  • 용도:
    • @SpringBootTest, @WebMvcTest 등에서 실제 빈 대신 mock을 써야 할 때
  • 예시:
    @SpringBootTest class MyTest { @MockBean MyService service; // 모든 @Autowired MyService는 mock으로 대체됨 }

요약 비교표

어노테이션mock or real?주입 방식사용 환경목적/특징

@Mock mock 필드에 직접 JUnit + Mockito 진짜 객체 대신 가짜(mock) 객체 생성
@Spy real + spy 필드에 직접 JUnit + Mockito 진짜 객체 일부만 mock, 나머지는 실제 동작
@InjectMocks real 자동 주입 JUnit + Mockito 대상 객체 생성 + @Mock/@Spy 자동 주입
@MockBean mock Spring Bean @SpringBootTest 등 스프링 빈을 mock으로 대체 (컨텍스트에 등록)

예제 코드

@SpringBootTest public class MyTest { @MockBean // Spring context에 mock 등록! MyService myService; @Autowired MyController myController; // myService가 mock으로 주입됨 }
class MyTest { @Mock MyService myService; // Mockito mock @Spy List<String> list = new ArrayList<>(); // 실제 동작, 일부만 mock 가능 @InjectMocks MyHandler handler; // handler에 myService가 자동 주입됨 (mock/spies) }

정리

  • 단위테스트(@Mock/@Spy/@InjectMocks): Mockito에서 객체 직접 생성, 주입
  • 스프링 통합테스트(@MockBean): 스프링 빈을 mock으로 대체, 스프링 컨텍스트에서 동작

 

'DEVELOP > Backend' 카테고리의 다른 글

[Spring] EnvironmentPostProcessor , PropertySourceLocator  (4) 2025.08.01
Spring AOP  (2) 2025.07.14
LLM Application 개발 이란?  (0) 2023.12.07
LangChain 이란?  (2) 2023.12.04
jsonString의 다형성 (feat. Gson)  (0) 2022.04.05

와우
벌써 10월이라니

이 일기를 1월부터 썼는데
벌써 10번째다

역시
난 꾸준함의 힘을
믿는다

10월초 연휴에
엄마랑 상해여행을 4박5일
다녀왔다

주토피아
주토피아 머리띠
디즈니 일루미네이션

처음봤다
디즈니 너무 덥고 힘들었지만
엄마가 나보다 더 잘다닌다..
어떻게 dpa하나두 안하고
기다려서 탔다

트론도 걱정했는데 재밌기만 했다

10년만에 동방명주
상해 음식1위 마늘롱샤 홍쿠이지아
호텔에서 준비해준 엄마 생신 케이크
우캉멘션

사람이 너어무 많았던 우캉멘션

기가 쪽 빨렸던 예원


지금 돌이켜보면 좋았다..
그때는 일정이 너무 빡세서
힘들다고 생각했는데

그래도 엄마도 너어무 좋아하시고
나도 즐겁게 다녀온거 같다
(기억미화)

그치만 담엔 더 여유롭게 다녀야징..

그리고 10월엔
생애 첫 10키로 마라톤 대회가 있어서
연습을 많이했다 ㅎㅎ



그리고 뛴 마라톤!!

헤헤 1시간 이내 성공!!



평소에 10키로 뛰면
보통 70분이 넘어서
목표가 70분이었는데
60분안이라니
완전 뿌듯 헤헤

이맛에 마라톤 뛰는구나?
대로를 달리는 기분이 꽤나 좋다

종종 나가도 될거 같다 ㅎㅎㅎㅎ


그리고 나선
일상으로 다시 돌아갔다

여름 내내 너무 돌아 다닌탓인가
일상이 그리웠다

동기들과 청모
오리발에 스티커 붙이기
내가 여행을 좋아하는 이유 중 하나

11월 1일 서핑


10월도 보면 알차게 보냈다
추워져서 요새는 러닝을 많이 못하지만

그래도 뛰고 싶고
책도 더 빨리 읽어야겠더

그래도 요새 일기를 꽤나 자주 쓰고 있다
긍정적인 영향이 있는거 같다

마음이 오락가락 할때도 있지만
일기와 사색을 통해서
가다듬고 있다

얼마 남지않은 올해 두달
알차고 단단하게
보내야지

'DIARY' 카테고리의 다른 글

2025년 9월의 일기  (0) 2025.10.02
2025년 8월의 일기  (1) 2025.09.04
2025년 7월의 일기  (4) 2025.08.01
2025년 6월의 일기  (2) 2025.07.02
2025년 5월의 일기  (0) 2025.06.01

9월에

여기저기
많이 놀러다녔다

일본도 가구
서핑도 여러번 가구

심지어 혼자서 서핑도 갔었다



너무 즐거웠던
구마모토 여행

친구들이랑 함께해서 너무 행복했다
2박3일 깔끔하고
딱좋아❤️

담에 일본 소도시 여행 또가야징




또 너무 즐거웠던
서핑 1박 트립

배불리 잘먹었다
파도가 너무 세서
그게 아쉬웠지만 ㅠㅠ
그래도 역시 즐거웠다


혼자서 즐거운 양양
나만의 힐링 스팟이
늘어나구 있다 헤헤

그리고 9월은 수영도 거의 안빠지고 나가고
자수도 나갔다
접영킥이 너무 어렵다 ㅠㅠ...

더 연습해야지
일이 좀 한가해져서
다시 운동을 열심히 하고 있다



사람 만나는건
만날수록 기준이 명확해지는데
나랑 맞는 사람은 아직은 못만났다 흑흑..
그치만
믿는다
내가 좋은 사람인만큼 성숙해진만큼
만나리라는 것을

요새 정신건강이 아주 좋다 호호

남은 2025년도
즐겁고 알차게
보내야지

믿는다!

'DIARY' 카테고리의 다른 글

2025년 10월의 일기  (0) 2025.11.05
2025년 8월의 일기  (1) 2025.09.04
2025년 7월의 일기  (4) 2025.08.01
2025년 6월의 일기  (2) 2025.07.02
2025년 5월의 일기  (0) 2025.06.01

일기를 써야지 써야지 하다가
겨우 쓴다..

8월은 돌이켜보면
그야말로 여름이지 않았나 싶다

제주도 3박 4일
양양-고성 2박3일
잠원 한강 수영장

수영을 배우니 세상이 그렇게 놀이터 같다



그치만 사진이 다 날라갔다

기존 핸드폰이 고장나서
새로운 핸드폰으로 바꿔서
다행히 보상판매가 가능해서
좋은 가격으로 새로운 핸드폰으로 바꿨다

재택 피씨도 고장나서 고치고

일도 정말 많고
만나자고 하는 사람도 많고
운동도 해야하고
여러므로 스케줄 정리하기도
버겁고 그래서
훌쩍 떠나기도 했던
8월


바다를 더 좋아하게되었다
파도가 좋을땐 서핑을 하고
없을땐 수영과 스노쿨을 하면 되니
바다만 가도 행복해진다


9월이 되고
이러저러한 일 때문에
여러가지 감정들로 복잡한데
이것도 한 2주가 지나면 괜찮아 지겠지

늘 그랬듯이
나를 또 다독이고
내가 나를 아껴줘야지

나는 늘 좋은 방향으로
가고 있다

'DIARY' 카테고리의 다른 글

2025년 10월의 일기  (0) 2025.11.05
2025년 9월의 일기  (0) 2025.10.02
2025년 7월의 일기  (4) 2025.08.01
2025년 6월의 일기  (2) 2025.07.02
2025년 5월의 일기  (0) 2025.06.01

 

EnvironmentPostProcessor랑 PropertySourceLocator 을 이용해서

기동 시점에 필요한 property 정보를 넘겨야 하는 일이 있었다. 

그래서 spring이 구동될때 언제 어떤 정보가 있는지가

중요해서 정리 보았다.

 

Spring Boot/Cloud 설정 적용 순서 (핵심만)

 

  1. bootstrap.yml (Spring Cloud 있을 때만, 부트스트랩 컨텍스트에서 먼저 읽음)
  2. PropertySourceLocator(외부에서 값을 받아와 환경에 추가할 수 있음, 부트스트랩 단계)
  3. EnvironmentPostProcessor(application.yml 적용 , 환경 가공)
  4. application.yml/properties(일반적인 설정)
  5. ApplicationContext 생성, @Bean 등등

 

1. SpringApplication 생성
2. ApplicationRunListeners 실행
   └ ApplicationStartingEvent 발생

3. prepareEnvironment()
   └ EnvironmentPostProcessor 실행 (1차, Main Context)
      → META-INF/spring.factories에 등록된 클래스
      → 예: AnyEnvironmentPostProcessor (1차 실행)

4. ConfigDataEnvironmentPostProcessor 실행
   └ application.yml, profile 등 config data 로드

5. Spring Cloud: BootstrapApplicationListener 작동
   └ bootstrap context 생성 (내부적으로 SpringApplication 또 만듦)
      └ 이 과정에서 EnvironmentPostProcessor 다시 실행 (2차, Bootstrap Context)
         → 예: AnyEnvironmentPostProcessor (2차 실행)
      └ PropertySourceLocator 실행
         → 예: AnyPropertySourceLocator.locate()
         → 외부 설정 서버에서 PropertySource 받아옴
      └ 받은 PropertySource를 원래(main) context에 merge

6. main context 구성 재개
   └ 받은 property를 포함해 Environment 구성됨

7. ApplicationContext 초기화, ApplicationRunner 실행 등...

'DEVELOP > Backend' 카테고리의 다른 글

@Mock vs @Spy vs @InjectMock vs @MockBean  (0) 2025.11.21
Spring AOP  (2) 2025.07.14
LLM Application 개발 이란?  (0) 2023.12.07
LangChain 이란?  (2) 2023.12.04
jsonString의 다형성 (feat. Gson)  (0) 2022.04.05


이제 2025년이 절반도 안남았구나
새삼..
저엉말 시간은 빠르다

7월은 음
근 5년만에 업무가 바껴서
저엉말
정신없이 보낸 하루하루 였다

개발 블로그니까
좀 더 얘기해보자면

그동안은 spring 을 쓰기만 했다면
이제는 framework을 만들어서
spring 내부 소스를 까본다는 점..

그동안 안해본걸 해봐서
하루하루가 새롭고
매일매일 새로운걸 배운당…

그만큼 회사에 있는 시간이
길어지구 있다
;ㅁ;



그치만 7월초에 시간내서
1박2일
서핑없는 서핑여행도 다녀왔꾸
넘넘 힐링이었따…


역시 양양/고성은 나에게
너무 힐링이야 ㅠㅠ..
가뭄에 단비같은 곳..


주말마다
친구들도 만나고
사람들도 많이 만났다
( 주말출근도 2회완..)



호호
생각도 정말 많이했지만
정신없어서 일생각을 정말 많이 한듯

나를 위한 선택이
어떤걸까에 대한 고민도 하고


7월말엔 한강수영장도 다녀왔다

날씨가 너무 더워서 요새는 수영이 가장
재밌는 운동이다

7월은 일하느라
정말 기가 다빨려서
책을 못읽었다

버스에서도 그냥
멍만 때렸다..
에너지가 없어서



이 글도
이번엔 중구난방 느낌..

올해 말엔 나는 어떤 모습일까
모든거에 열심히인 나는
요새 조금씩 지치는거 같당..

휴가가 필요하다 🥲

한번 더가야지 8월에 한강수영장..

'DIARY' 카테고리의 다른 글

2025년 9월의 일기  (0) 2025.10.02
2025년 8월의 일기  (1) 2025.09.04
2025년 6월의 일기  (2) 2025.07.02
2025년 5월의 일기  (0) 2025.06.01
2025년 4월의 일기  (2) 2025.05.01

회사에서 업무가 바껴서 Spring Boot Framework단을 더 만질일이 생겼다

그래서 다시한번 복습!

 

그치만 사진이 올라가야 이해하기 쉬운데... 집에서 마저 올리길..


 

AOP (Aspect-Oriented Programming) 관점 지향 프로그래밍 

애스팩트(=관점) 를 사용한 프로그래밍 방식 

횡단 관심사를 깔끔하게 처리 

 

AspectJ 프레임워크

스프링의 AOP는 AspectJ의 문법을 차용하며, AspectJ가 제공하는 기능 일부만 제공

횡단 관심사의 깔끔한 모듈화

  • 오류 검사 및 처리
  • 동기화
  • 성능 최적화 (캐싱)
  • 모니터링 및 로깅

 

AspectJ 에서 AOP 적용 방식

  • 컴파일 시점
  • 클래스 로딩 시점
  • 런타임 시점(프록시) → 스프링에서 사용하는 방식

Spring AOP 관련 용어들 다시 정리 

Join Point "어디서 AOP를 적용할 수 있지?"
Spring AOP 기준: public 메서드 호출 시점 (즉, 메서드 실행 전후 등)
Pointcut Advice 적용할 Join Point(메서드)들을 패턴으로 골라내는 규칙
Join Point들 중 실제로 Advice가 적용될 타깃을 골라내는 규칙
예: "com.example.service 패키지 아래의 모든 메서드"
Target 어드바이스를 받는 객체
핵심 비즈니스 로직이 구현된 클래스
Advice 부가 기능
특정 조인포인트에서 Aspect에 의해 취해지는 조치
Around, Before, After 와 같은 다양한 종류의 어드바이스가 있음
Aspect "공통 관심사"의 덩어리. 
어드바이스+포인트컷을 모듈화 한 것
@Aspect
Weaving Advice를 실제 Target Object 코드에 붙이는 과정
Spring AOP는 런타임에 프록시(Proxy) 객체를 만들어 위빙함
Proxy Advice가 주입된, Target Object를 감싸는 대리 객체
실제 Service 객체 대신 프록시를 Bean으로 주입해서 AOP 적용

자동 프록시 생성기가 하는 일

  1. @Aspect를 보고 Advisor로 변화 후 저장
  2. Advisor를 기반으로 프록시 생성

1.@Aspect를 Advisor로 변환 후 저장

  1. 스프링 애플리케이션 로딩 시점에 자동 프록시 생성기를 호출
  2. 자동 프록시 생성기는 스프링 컨테이너에서 @Aspect 어노테이션이 붙은 스프링 빈 모두 조회
  3. @Aspect 어드바이저 빌더를 통해 @Aspect 애노테이션 정보를 기반으로 어드바이저 생성
  4. 생성한 어드바이저를 @Aspect 어드바이저 빌더 내부 저장

 

*참고 

@Aspect 어드바이저 빌더

BeanFactoryAspectAdvisorBuilder 클래스

Aspect 의 정보를 기반으로 포인트컷 , 어드바이스 , 어드바이저를 생성보관

 

2. Advisor를 기반으로 프록시 생성

 

1.스프링 빈 대상이 되는 객체 생성 (@Bean , 컴포넌트 스캔)

2.전달된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달(PostBeanProcessor??)

3-1. 스프링 컨테이너에서 Advisor 빈을 모두 조회

3-2. @Aspect 어드바이저 빌더 내부에 저장된 Advisor 를 모두 조회
4. 앞서 3-1, 3-2에서 조회한 Advisor 에 포함되어 있는 포인트컷을 사용해서
해당 객체가 프록시를 적용할 대상인지 아닌지 판단한다. 이때 객체의 클래스 정보는 물론이고, 해당 객체의
모든 메서드를 포인트컷에 하나하나 모두 매칭해본다. 그래서 조건이 하나라도 만족하면 프록시 적용
대상이 된다. 예를 들어서 메서드 하나만 포인트컷 조건에 만족해도 프록시 적용 대상이 된다.
5. 프록시 적용 대상이면 프록시를 생성하고 프록시를 반환한다. 그래서 프록시를 스프링
빈으로 등록한다. 만약 프록시 적용 대상이 아니라면 원본 객체를 반환해서 원본 객체를 스프링 빈으로
등록한다.
6. 반환된 객체는 스프링 빈으로 등록된다.

https://ko.react.dev/learn/thinking-in-react

 

정리하자면,,,

State 는 어떤걸로?

  • 시간이 지나면서 변할 수 있음
  • props로 받는거 아님
  • 계산 가능 아님 ( vue에서 computed 에 들어가는건 아님.. 이렇게 이해)

State 어디에 위치?

  • 공통부모
  • 공통부모가 없다면 그 상위
  • 아니면 새로 상위 컴포넌트 만들어서
더보기

이 중 어떤 게 State가 되어야 할까요? 아래의 세 가지 질문을 통해 결정할 수 있습니다.

  • 시간이 지나도 변하지 않나요? 그러면 확실히 State가 아닙니다.
  • 부모로부터 Props를 통해 전달됩니까? 그러면 확실히 State가 아닙니다.
  • 컴포넌트 안의 다른 State나 Props를 가지고 계산 가능한가요? 그렇다면 절대로 State가 아닙니다!

그 외 남는 건 아마 State일 겁니다.

  • 제품의 원본 목록은 Props로 전달되었기 때문에 State가 아닙니다.
  • 사용자가 입력한 검색어는 시간에 따라 변하고, 다른 요소로부터 계산할 수 없기 때문에 State로 볼 수 있습니다.
  • 체크박스의 값은 시간에 따라 바뀌고 다른 요소로부터 계산할 수 없기 때문에 State로 볼 수 있습니다.
  • 필터링된 제품 목록은 원본 제품 목록을 받아서 검색어와 체크박스의 값에 따라 계산할 수 있으므로, 이는 State가 아닙니다.

따라서, 검색어와 체크박스의 값만이 State입니다! 잘하셨습니다! → 이걸보면 입력값을 state로 두면 되려나...?

 

 

State가 어디에 위치해야 하는지 결정

대개, 공통 부모에 State를 그냥 두면 됩니다.

혹은, 공통 부모 상위 컴포넌트에 둬도 됩니다.

State를 소유할 적절한 컴포넌트를 찾지 못했다면, State를 소유하는 컴포넌트를 하나 만들어서 상위 계층에 추가하세요.

 

Props vs State

React는 Props와 State라는 두 개의 데이터 “모델”이 존재합니다. 둘의 성격은 매우 다릅니다.

  • Props는 함수를 통해 전달되는 인자 같은 성격을 가집니다. Props는 부모 컴포넌트로부터 자식 컴포넌트로 데이터를 넘겨서 외관을 커스터마이징하게 해줍니다. 예를 들어, Form은 color라는 Prop을 Button으로 보내서 Button을 내가 원하는 형태로 커스터마이징할 수 있습니다.
  • State는 컴포넌트의 메모리 같은 성격을 가집니다. State는 컴포넌트가 몇몇 정보를 계속 따라갈 수 있게 해주고 변화하면서 상호작용Interaction을 만들어 냅니다. 예를 들어, Button은 isHovered라는 State를 따라갈 것입니다.
  • Props와 State는 다르지만, 함께 동작합니다. State는 보통 부모 컴포넌트에 저장합니다. (그래서 부모 컴포넌트는 그 State를 변경할 수 있습니다.) 그리고 부모 컴포넌트는 State를 자식 컴포넌트에 Props로서 전달합니다. 처음 봤을 때 둘의 차이를 잘 알기 어려워도 괜찮습니다. 약간 연습이 필요할 거예요!

리렌더링?

  • React는 다른부분만 리렌더링 → 최적화
  • 모든 이벤트 핸들러가 실행되고 set 함수를 호출 한 후 화면 업데이트 → 단일 이벤트 중 여러번 리렌더링 방지 
더보기

사용자가 제공한 새로운 값이 Object.is에 의해 현재 state와 동일하다고 판정되면, React는 컴포넌트와 그 자식들을 리렌더링하지 않습니다.

이것이 바로 최적화입니다. 경우에 따라 React가 자식을 건너뛰기 전에 컴포넌트를 호출해야 할 수도 있지만, 코드에 영향을 미치지는 않습니다.

 

React는 state 업데이트를 batch 합니다. 모든 이벤트 핸들러가 실행되고 set 함수를 호출한 후에 화면을 업데이트합니다. 이렇게 하면 단일 이벤트 중에 여러 번 리렌더링 하는 것을 방지할 수 있습니다. 드물지만 DOM에 접근하기 위해 React가 화면을 더 일찍 업데이트하도록 강제해야 하는 경우, flushSync를 사용할 수 있습니다.

 

출처: <https://ko.react.dev/reference/react/useState>

 

 


라이프사이클

 

  • mount(생성): useEffect(() => { ... }, [])
  • update(업데이트): useEffect(() => { ... }, [의존값])
  • unmount(소멸): useEffect 반환 함수(return () => { ... })
import { useEffect } from "react"; 
 
function MyComponent() { 
  useEffect(() => { 
    // (생성/마운트 - created, mounted) 
    // 여기에 API 호출 등 
    console.log('컴포넌트가 마운트됨'); 
 
    return () => {  
      // (언마운트 - destroyed) 
     // 이벤트 제거, 타이머 해제 등  
      console.log('컴포넌트가 소멸됨'); 
    }; 
  }, []); // 의존성 배열 - 빈 배열이면 최초/언마운트만 실행됨 
     
  return <div>Hello</div>; 
}

JSX

https://ko.react.dev/learn/writing-markup-with-jsx

 

 

 

1.하나의 루트 엘리먼트로 반환하기

JSX는 HTML처럼 보이지만 내부적으로는 일반 JavaScript 객체로 변환됩니다.

하나의 배열로 감싸지 않은 하나의 함수에서는 두 개의 객체를 반환할 수 없습니다. 

따라서 또 다른 태그나 Fragment로 감싸지 않으면 두 개의 JSX 태그를 반환할 수 없습니다.

2. 모든 태그는 닫아주기 (당연한거 아닌가..?)

3. 거의 대부분 캐멀 케이스로 작성


양방향 바인딩

vue에서 v-model 인것

  • 값 상태 관리와 변경 이벤트가 분리되어 있음
import { useState } from "react"; 
 
function MyInput() { 
  const [text, setText] = useState(''); 
  return ( 
    <input  
      value={text} 
      onChange={e => setText(e.target.value)} 
    /> 
  ); 
}

리액티브 vs. 선언적, 불변성 관리

Vue

  • Vue는 this.message = "hi"처럼 변경하면 자동으로 UI가 갱신
  • 배열/객체 변화도 내부적으로 Proxy로 추적

React

  • "불변성 유지"를 아주 중요하게 여김!
  • 상태 변경 시 새로운 객체 생성 필요.
    (기존 객체나 배열 수정 X, 꼭 새로운 레퍼런스 할당 O)
  • 주요 이유: 레퍼런스가 달라져야 리렌더링이 발생함
  • 객체도 마찬가지로 spread (...) 문법 등으로 새 객체를 만들어야 함.

    즉, 상태(객체/배열) 변경 시 무조건 "복제 → 새롭게 할당" 방식이 기본!
// 잘못된 예시 (직접 수정) 
const [arr, setArr] = useState([1,2,3]); 
arr.push(4);          // X (불변성 위배) 
setArr(arr); 
   
// 올바른 예시 (새 배열 할당) 
setArr(prev => [...prev, 4]);   // O

 


컴포넌트 통신

vue 에서는 

  • 부모 → 자식 props로 전달
  • 자식 → 부모 $emit

React에서는

  • 부모 → 자식 props로 전달
  • 자식 → 부모 자식이 콜백 실행 

 

  • React는 emit과 같은 전용 시스템이 없습니다.
  • 자식이 부모에게 데이터를 전달하려면, "부모가 함수(콜백)를 props로 주고, 자식이 그 함수를 호출"하는 방식입니다.
  • 컴포넌트 간 state 이동은 props를 통해, cross-parent 간 이동은 상태 끌어올리기(lifting state) 방법을 자주 사용합니다.
import React, { useState } from 'react'; 
   
function Child({ msg, onMsg }) { 
  return ( 
    <div> 
      <div>자식에서 받은 값: {msg}</div> 
      <button onClick={() => onMsg('자식에서 클릭됨!')}> 
        부모에 이벤트 알리기 
      </button> 
    </div> 
  ); 
} 
   
function Parent() { 
  const [parentMsg] = useState('부모의 메시지!'); 
   
  const handleChildMsg = (childMsg) => { 
    alert('자식에서 받은 메시지: ' + childMsg); 
  }; 
   
  return ( 
    <div> 
      <Child msg={parentMsg} onMsg={handleChildMsg} /> 
    </div> 
  ); 
} 
   
export default Parent;

 

상태관리

Vue

  • Vuex (store, module, action/mutation 등)

React

  • 복잡도/팀 규모에 따라 매우 다양함
  • Context API: 간단한 전역상태 마치 Vue의 provide/inject 느낌
  • 외부 라이브러리:
    • Redux: 전통적, 정말 많은 기능(개발툴, 미들웨어)
    • Recoil / Zustand: 간단한 글로벌 state
    • MobX: 리액티브한 구조, 데코레이터 기반

      상태 관리 패턴
  • 기본적으로 "props-drilling"(여러 단계 props 전달)이 발생하면 Context나 외부 상태관리 사용 고려
  • 작은 프로젝트 → useState/Context 조합으로도 충분
  • 프로젝트가 커지면 Redux, Recoil, Zustand 등 사용 → 우리는 redux 사용 

1. Context API

1) 개념

  • React 공식 내장 기능(외부 라이브러리 불필요)
  • 컴포넌트 트리 전체에서 전역적으로 데이터를 쉽게 공유
  • 예: "로그인 정보, 테마, 언어" 등 여러 곳에서 반복적으로 쓰이는 값 관리에 적합

2) 원리

  • createContext로 context를 생성
  • Context.Provider로 값(value)을 하위 트리에 "공급(Provide)"
  • 하위 컴포넌트 어디서든 useContext(Context)로 참조 가능
import { createContext, useContext, useState } from 'react'; 
   
const NameContext = createContext(); 
   
function App() { 
  const [name, setName] = useState('철수'); 
   
  return ( 
    <NameContext.Provider value={{ name, setName }}> 
      <Child /> 
    </NameContext.Provider> 
  ); 
} 
   
function Child() { 
  const { name, setName } = useContext(NameContext); 
  // 이렇게 중첩된 컴포넌트 어디서나 쉽게 접근 
  return <input value={name} onChange={e => setName(e.target.value)} />; 
}

 

 

장점

  • 별도 라이브러리 없이 전역 상태 가능
  • 코드량 적음, 간단한 앱에 적합

단점

  • 상태 변경 시 Provider 하위 모든 컴포넌트가 "무조건" 리렌더링됨 (성능 문제)
  • 복잡한 전역 상태나 로딩/비동기 관리엔 한계

 

2. Redux

1) 개념

  • React 중심의 가장 오래되고 유명한 상태 관리 라이브러리
  • 아주 큰 앱(대규모 상태/데이터 흐름, 복잡한 데이터 구조, 액션 추적, 미들웨어 필요 등)에 특화
  • 상태의 일관성, 예측가능성, 시간여행(debugging) 보장

2) 원리

  •  메인 구성요소
    • 상태(state)를 담고있는 중앙 저장소(하나만 존재)
    2. action (액션)
    • "이런 일이 일어났다!"라는 신호(객체/함수)
    • { type: 'INCREMENT', payload: 3 } 처럼 객체
    3. reducer (리듀서)
    • 스토어의 상태를 "어떻게 바꿀지" 결정하는 함수
    • 이전 상태+액션 → 새 상태 반환 (상태를 직접 바꾸지 않고, "복사본 새로 만듦" ★불변성)
  • 1. store (스토어)
  •  Redux 상태 변화 흐름
  1. 액션 발행(dispatch action)
    • 사용자가 버튼 클릭 → "INCREMENT"라는 액션을 발생시키도록 코드가 dispatch
  2. 리듀서(reducer)가 호출됨
    • 현재 상태와 액션을 인자로 받아 새로운 상태를 '리턴'
  3. 스토어(store)가 새 상태로 변경
    • 변경된 상태를 스토어가 갖게됨
  4. React 컴포넌트는 구독해 두었다가, 상태가 바뀌면 자동으로 리렌더링됨

장점

  • 아주 안정적, 예측가능/디버깅 최상, 미들웨어 확장 쉬움
    (로깅, API관리, 비동기 등 커스텀 작업풍부)
  • 레거시 기업/대형서비스에서 매우 많이 사용

    단점
  • 코드량 많음/복잡(boilerplate), 작은 앱에 불필요하게 무거움
  • 리듀서/액션/스토어/미들웨어 등 개념이 많아서 진입장벽 있음

갸악!!!!
이틀이나 늦은 6월의 일기
점점 늦어지는건 기분탓일까? (아니. 팩트임.)

한달이 지나고 회고 하는 거라고 합리화

6월을 회고해보니 강의를 많이 들었네

저속노화 정희원 교수님 강의 1회
송희구 부동산 강의 2회



그리고 헬스가 재미가 붙이던 차에
다시 못하는중..

러닝도 재밌게 하다가
더워서 쉬는중^^ㅎㅎ




강의는 모두 좋았다
저속노화 강의 들으면서는
내가 살고 있는 이 방향성이 옳다고 느꼈고
도파민을 추구할수록 불행해지고
지금처럼 소소하게 사는게
더행복하다는거 후후🤍

부동산강의는
많은걸 배우고 얻었다
돈값했다 ㄹㅇ
하지만 좀더 기다려야겠다
지금 내 상황상..


못만났던 친구들도
오랜만에 많이 만났다


가끔 보아도 좋은 칭구들
칭구들이 있어 행복하다
칭구들도 내가 있어서 행복하겠지?
소중한 인연들 잘 유지해야지


회사에서 회식도 두번이나 했다
귀찮았지만
가고나면 좋다
아이러니
이것이 I의 마음인가


새로운 사람들도 많이 만났지만
쭉 이어질 인연을 만나진 못했던거 같다
그렇지만 인생
어떻게 될지 모르지 ?




전반적으로
5월에 힘들었던걸
천천히 회복하는 기간 이었다
모두 건강하게 해소한 거 같아 뿌듯하다


책을 또 별로 안읽었네;;;



6월 정말 알차게 보냈고
잘보냈다

나를 가만히 지켜보니
나는 어찌됐든
건강한 답을 찾아가는 사람 같다

나 스스로도 그걸 좋아하고
그렇지 않아하면 오히려 괴로워 한다
그러는 나도 잘받아줘야지
내가






'DIARY' 카테고리의 다른 글

2025년 8월의 일기  (1) 2025.09.04
2025년 7월의 일기  (4) 2025.08.01
2025년 5월의 일기  (0) 2025.06.01
2025년 4월의 일기  (2) 2025.05.01
2025년 3월의 일기  (2) 2025.03.22

+ Recent posts