๐ Spring/Spring ํต์ฌ ๊ธฐ์
์คํ๋ง ํ๋ ์์ํฌ 5์ ์ถ๊ฐ๋ Null ๊ด๋ จ ์ ๋
ธํ
์ด์
org.springframework.lang.* @NonNull @Nullable @NonNullApi (ํจํค์ง ๋ ๋ฒจ ์ค์ ) @NonNullField (ํจํค์ง ๋ ๋ฒจ ์ค์ ) ๋ชฉ์ (ํด์ ์ง์์ ๋ฐ์) ์ปดํ์ผ ์์ ์ ์ต๋ํ NPE(NullPointerException)์ ๋ฐฉ์งํ๋ ๊ฒ null ์ฒดํฌ๋ฅผ ํ์ง ์์์ ์๊ธฐ๋ NPE ๋ฐฉ์ง @NonNull org.springframework.lang.NonNull ์ฌ์ฉ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ ๋ถ์ด๋ ๊ฒฝ์ฐ -> null ๊ฐ์ด ๋ค์ด์ค์ง ๋ชปํ๋๋ก ๋ฐฉ์ง @Service public class EventService { @NonNull // (1) public String createEvent(@NonNull String na..
๐ Spring/Spring ํต์ฌ ๊ธฐ์
์ ๋
ธํ
์ด์
๊ธฐ๋ฐ์ ์คํ๋ง @AOP ์์กด์ฑ ์ถ๊ฐ org.sringframework.boot spring-boot-starter-aop Aspect ์ ์ @Aspect ๋น์ผ๋ก ๋ฑ๋กํด์ผ ํ๋๊น (์ปดํฌ๋ํธ ์ค์บ์ ์ฌ์ฉํ๋ค๋ฉด) @Component๋ ์ถ๊ฐ ํฌ์ธํธ์ปท ์ ์ @PointCut(ํํ์) ์ฃผ์ ํํ์ execution @Service public class SimpleEventService implements EventService{ @Override public void createEvent() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("create an Eve..
๐ Spring/Spring ํต์ฌ ๊ธฐ์
์คํ๋ง AOP ํน์ง ํ๋ก์ ๊ธฐ๋ฐ์ AOP ๊ตฌํ์ฒด ์คํ๋ง ๋น์๋ง AOP๋ฅผ ์ ์ฉํ ์ ์๋ค. ๋ชจ๋ AOP ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด ๋ชฉ์ ์ด ์๋๋ผ, ์คํ๋ง IoC์ ์ฐ๋ํ์ฌ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์
์์ ๊ฐ์ฅ ํํ ๋ฌธ์ (์ค๋ณต์ฝ๋, ํ๋ก์ ํด๋์ค๋ฅผ ๋ง๋๋ ๋น์ฉ๊ณผ ์๊ณ , ๊ฐ์ฒด๋ค ๊ฐ ๊ด๊ณ ๋ณต์ก ๋ฑ๋ฑ)์ ๋ํ ํด๊ฒฐ์ฑ
์ ์ ๊ณตํ๋ ๊ฒ์ด ๋ชฉ์ . ํ๋ก์ ํจํด (๊ธฐ์กด ์ฝ๋ ๋ณ๊ฒฝ ์์ด) ์ ๊ทผ ์ ์ด ๋๋ ๋ถ๊ฐ ๊ธฐ๋ฅ ์ถ๊ฐ ํ๋ก์ ํจํด์ ์ด์ฉํ์ฌ ๊ธฐ์กด ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์ฑ๋ฅ์ ์ธก์ ํด๋ณด๊ฒ ๋ค. @Component public class AppRunner implements ApplicationRunner { @Autowired EventService eventService; //interface๊ฐ ์๋ค๋ฉด interfaceํ์
์ผ๋ก ๋ฐ๋๊ฒ ..
๐ Spring/Spring ํต์ฌ ๊ธฐ์
Aspect-oriented Programming (AOP)์ OOP๋ฅผ ๋ณด์ํ๋ ์๋จ์ผ๋ก, ํฉ์ด์ง Aspect๋ฅผ ๋ชจ๋ํ ํ ์ ์๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ. ํฉ์ด์ง ๊ด์ฌ์ฌ (Crosscutting *Concerns) *Concerns : ๋น์ทํ ์ฝ๋, ๋น์ทํ ํธ์ถ ๋ฑ๋ฑ. AOP๋ฅผ ์ ์ฉ ํ๋ฉด? Aspect๋ก ํฉ์ด์ง ๊ฒ๋ค์ ํ๊ณณ์ผ๋ก ๋ชจ์๋ค. AOP ์ฃผ์ ๊ฐ๋
Aspect ์ Target Advice Join point ๊ณผ Pointcut Aspect : ํฉ์ด์ง ๊ด์ฌ์ฌ๋ฅผ ํ๊ณณ์ผ๋ก ๋ชจ๋ํ ํ ๊ฒ. Advice : ์ด๋ค ์ผ์ ํด์ผ ํ๋์ง์ ๋ํ ์ ๋ณด. Join point : ์์ฑ์ ํธ์ถํ๊ธฐ ์ง์ , ์์ฑ์๋ฅผ ํธ์ถํ์๋, ํ๋์์ ๊ฐ์ ๊ฐ์ ธ๊ฐ์๋...๋ฑ๋ฑ ์ฌ๋ฌ๊ฐ์ง ํฉ๋ฅ์ . Pointcut: A๋ผ๋ ํด๋์ค์ b๋ผ๋ ๋ฉ์๋๋ฅผ ..
๐ Spring/Spring ํต์ฌ ๊ธฐ์
์คํ๋ง ELโ์ด๋? ์คํ๋ง ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ํ์๋ก ํ๋ค๋ณด๋๊น, Unified EL ์ ๋ฉ์๋ ํธ์ถ ๊ธฐ๋ฅ๊ณผ, ๋ฌธ์์ด ํ
ํ๋ฆฟ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ์คํ๋ง์ด SpEL์ ๊ฐ๋ฐํ๊ฒ ๋๊ฒ์ด๋ค. ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์กฐํํ๊ณ ์กฐ์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. Unified ELโ๊ณผ ๋น์ทํ์ง๋ง, ๋ฉ์๋ ํธ์ถ์ ์ง์ํ๋ฉฐ, ๋ฌธ์์ด ํ
ํ๋ฆฟ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค. OGNL, MVEL, JBOss EL ๋ฑ ์๋ฐ์์ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ EL์ด ์์ง๋ง, SpEL์ ๋ชจ๋ ์คํ๋ง ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ์ฌ์ฉํ EL๋ก ๋ง๋ค์๋ค. ์คํ๋ง 3.0 ๋ถํฐ ์ง์. SpEL ๊ตฌ์ฑ ExpressionParser expressionParser = new SpelExpressionParser(); Expression expression = expressionParser...
๐ Spring/Spring ํต์ฌ ๊ธฐ์
Converter S ํ์
์ T ํ์
์ผ๋ก ๋ณํํ ์ ์๋ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ๋ณํ๊ธฐ ์ํ ์ ๋ณด ์์ == Stateless = ์ฐ๋ ๋์ธ์ดํ public class EventConverter { public static class StringToEventConverter implements Converter{ @Override public Event convert(String source) { return new Event(Integer.parseInt(source)); }//String์์ Event๋ก Event/Constructor์ source๋ฅผ ๋๊ธด๋ค. } public static class EventToString implements Converter{ @Override public String con..