[Spring] stackOverflowError

DANIยท2023๋…„ 12์›” 13์ผ

Spring[๊น€์˜ํ•œT]

๋ชฉ๋ก ๋ณด๊ธฐ
31/31
post-thumbnail

๐Ÿšซ stackOverflowError ์—๋Ÿฌ



์•„๋‹ˆ ๋‚˜์—๊ฒŒ ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์—๋Ÿฌ๋ผ๋‹ˆ;; ๋„ˆ๋ฌด ๋‹นํ™ฉ์Šค๋Ÿฝ๊ณ ..


๐Ÿ” stackOverflowError ์—๋Ÿฌ๋ž€?


์Šคํƒ ํ”„๋ ˆ์ž„ ๋ฐ StackOverflowError ๋ฐœ์ƒ ๋ฐฉ์‹

๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ˜ธ์ถœ ์Šคํƒ์— ์ƒˆ ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์ƒ์„ฑ๋œ๋‹ค.

์ด ์Šคํƒ ํ”„๋ ˆ์ž„์€ ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜, ๋กœ์ปฌ ๋ณ€์ˆ˜ ๋ฐ ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ์ฃผ์†Œ, ์ฆ‰ ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋œ ํ›„ ๋ฉ”์„œ๋“œ ์‹คํ–‰์ด ๊ณ„์†๋˜์–ด์•ผ ํ•˜๋Š” ์ง€์ ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์Šคํƒ ํ”„๋ ˆ์ž„ ์ƒ์„ฑ์€ ์ค‘์ฒฉ๋œ ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ๋ฐœ๊ฒฌ๋œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์˜ ๋์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์†๋œ๋‹ค.

์ด ๊ณผ์ •์—์„œ JVM์ด ์ƒˆ ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์ƒ์„ฑํ•  ๊ณต๊ฐ„์ด ์—†๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉด StackOverflowError ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค..



๐Ÿ” stackOverflowError ์›์ธ


  • JVM์ด ์ด ์ƒํ™ฉ์— ์ง๋ฉดํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์›์ธ์€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€/๋ฌดํ•œ ์žฌ๊ท€

  • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์Šคํƒ์ด ์†Œ์ง„๋  ๋•Œ๊นŒ์ง€ ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ„์† ํ˜ธ์ถœํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค

  • ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ๋ฐฉ๋Œ€ํ•œ ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ.

  • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ํด๋ž˜์Šค ๊ฐ„์— ์ˆœํ™˜ ๊ด€๊ณ„๋ฅผ ๊ฐ–๋„๋ก ์„ค๊ณ„๋˜์—ˆ์„ ๋•Œ๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ ์„œ๋กœ์˜ ์ƒ์„ฑ์ž๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์–ด ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ์žฌ๊ท€์˜ ํ•œ ํ˜•ํƒœ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ๋‹ค.

  • ์ด ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ค๋Š” ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ํด๋ž˜์Šค๊ฐ€ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์™€ ๋™์ผํ•œ ํด๋ž˜์Šค ๋‚ด์—์„œ ์ธ์Šคํ„ด์Šคํ™”๋˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ์ด๋กœ ์ธํ•ด ๋™์ผํ•œ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ๋ฐ˜๋ณตํ•ด์„œ(์žฌ๊ท€์ ์œผ๋กœ) ํ˜ธ์ถœ๋˜์–ด ๊ฒฐ๊ตญ StackOverflowError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ฐธ๊ณ  : https://recordsoflife.tistory.com/1220



๐Ÿ”‘ ํ•ด๊ฒฐ๋ฐฉ์•ˆ

package domain.Order;

import domain.Member.MemberRepository;
import domain.Member.MemberSerivice;
import domain.Member.MemberServiceimpl;
import domain.Member.MemoryMemberRepository;
import jakarta.inject.Provider;
import org.springframework.beans.factory.ObjectProvider;

public class AppConfig {

    public MemberSerivice memberSerivice(){
        return new MemberServiceimpl(memberRepository());
    }

    public MemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }

    public OrderRepository orderRepository(){
        return new MemoryOrderRepository();
    }

  	// ์—ฌ๊ธฐ๊ฐ€ ๋ฌธ์ œ
    public OrderService orderService(){
        return new OrderServiceImpl(orderRepository(), discountPolicy());

    }

    // ์—ฌ๊ธฐ๊ฐ€ ๋ฌธ์ œ
    public DiscountPolicy discountPolicy(){
  		// ์ˆ˜์ • ์ „
        // return new RateDiscountPolicy(orderService());
  		return new RateDiscountPolicy(); // ์ˆ˜์ • ํ›„
    }
}

discountPolicy()์™€ orderService()๊ฐ€ ์„œ๋กœ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ๋ผ์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์˜€๋‹ค.
๋‚˜์˜ ๊ฒฝ์šฐ๋Š” discountPolicy()์— orderService()๋ฅผ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ ์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ, ๋งŒ์•ฝ์— ์ˆœํ™˜์ฐธ์กฐ๋ฅผ ํ•ด์•ผํ•  ์ƒํ™ฉ์ด ์ƒ๊ธธ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์€ lazy๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑ์„ ๋ฏธ๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ์ข‹์€ ์„ค๊ณ„ ๋ฐฉ๋ฒ•์€ ์ˆœํ™˜์ฐธ์กฐ ์ž์ฒด๋ฅผ ์—†์• ๋Š” ๊ฒƒ!

0๊ฐœ์˜ ๋Œ“๊ธ€