목록개발/Backend (13)
leelee.log
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/mbMvU/btsaV22aGuS/EkmhB1sE5I1EG4BFHrAg50/img.png)
2020-09-18에 작성된 How to deal with SQL exception in Spring boot 를 옮겨왔습니다. [Backend] (en) How to deal with SQL exception in Spring boot Handles SQL Exception in Spring boot: Checked exception, unchecked exception, leeleelee3264.github.io Handles SQL Exception in Spring boot: Checked exception, unchecked exception, Index Exception in Java Handle SQL Exception Reference Exception in Java A week ago, ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/O8U6S/btqEmLRR2Rg/S9xgGOgMF8JbA8PwWBU5lK/img.png)
웹 페이지를 만들다보면 Resource 를 사용할 일이 정말 많아진다. 여기서 주로 사용하는 Resource는 HTML, Javascript, Css, png 등이 있다. 이 Resource를 또 동적인 리소스 (dynamic resource)와 정적인 리소스 (static Resource)로 구분을 할 수 있는데 내가 이해한 바로는 동적인 리소스는 runtime에 변화가 있는 리소스이고, 정적인 리소스는 변화가 없는 리소스이다. 예를 들어 이미지와 javascript, css와 같은 파일들은 서버에 저장되어 있을 때도, 클라이언트에게 줄 때도 변화가 없다. 그래서 변화가 없는 정적인 리소스가 된다. 이제 HTML을 한 번 생각해보자. HTML은 틀이고, HTML을 채우는 알맹이는 db에서 가져온 정보이..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Dbsfx/btqDaiD2zaH/Ev5geqvKDo8299AM2iA781/img.png)
intellij로 spring boot 프로젝트를 만들면 꼭 같이 만들어지는 파일이 하나 있다. 바로 application.properties라는 파일인데 처음에는 db의 url과 아이디/비밀번호를 써서 db 연결에만 사용하고 있었지만 요즘은 프로젝트에서 사용되는 전역적인 정보들을 기록해둬서 @Value 어노테이션으로 값을 빼와 코드에 사용하고는 한다. 여기서의 전역적인 정보들은 보통 1. 사용하는 api key 2. port와 context-path 3. 파일이 업로드 될 주소 가 등 이 있다. profile 과 properties의 차이를 처음에는 헷갈려 했는데 강의를 다 듣고 나니 properties는 key-value 쌍의 정보고, 그 properties가 모여있는 하나의 파일을 profile이라..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bhuru8/btqC79S5png/0Tlq3K9vFg3qxqlEj5xcXK/img.png)
Scope라는 단어를 처음 봤을 때는 javascript에서 함수를 배우고 있었다. 사전에서 Scope라는 뜻을 찾아보면 '범위'라고 나온다. 오늘 다루는 주제는 Bean의 Scope, 즉 범위이다. Bean은 일반 자바 객체와는 조금 다른 형태의 스코프를 가지고 있다. Bean을 스프링에서 사용하는 자바 객체라고 말을 하고는 했었는데 특별한 설정을 하지 않았을 때 Bean은 singleton 형태로 만들어진다. spring을 동작 시킬 때 딱 한 번 객체가 만들어지고 계속 사용한다는 뜻이다. Spring에서 annotation을 사용하지 않는 일반 자바 객체들은 사용을 할 때 마다 생성자로 만드는 prototype 형태로 만들어지는데 알고보니 Bean또한 prototype 형태로 만들 수 있었다. 즉,..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/k6tQH/btqCMoRPkt3/QKeWMZA4en8PEikL1Rk5zk/img.png)
@Configuration에 @Bean으로 빈을 등록했는데 동일한 return 타입을 가지고 있거나, @Autowired를 해야되는 상황에 복수의 class에 implements 되어있는 interface를 사용했을 경우 Spring에서는 여러가지 선택지 중에서 어떤걸 bean으로 만들어야 하는지 몰라서 오류를 만들어낸다. 이런 상황이 많지는 않겠지만 @Primary와 @qualifier를 통해서 해결을 할 수 있다. 그런데 명심해야할 점은 어지간하면 bean을 중복으로 만들지 않는게 제일 좋은 해결책이라는 사실이다. 문제가 발생할 수 있는 상황 1 @Configuration 파일에 return value가 똑같은 Bean이 선언되어있다. Spring의 입장에서는 만들면 다 똑같은 Bean이라서 이러면 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bpu2iN/btqCNarFTdn/fePvXd6ALQWt6CEFdpg200/img.png)
Spring에서 프로젝트를 구동하기 위해서 제일 처음으로 실행되는 class는 @SpringBootApplication이라는 어노테이션이 붙어있는 class이다. 여기서 모든 것이 시작 되었다고 말 할 수 있다. 그럼 @SpringBootApplication에 뭐가 들어있을까? 점점 공부를 하면서 드는 생각이지만 Spring에서 제일 중요한 개념은 Bean이 아닐까 싶다. @SpringBootApplication이 중요한 이유는 @ComponentScan이라는 어노테이션을 품고 있기 때문이다. @ComponentScan은 Spring에게 어디서부터 어디까지의 @Component 어노테이션이 붙은 class들을 읽어들여 bean을 만들어야 하는지를 알려준다. 여기서 중요한 사실은 기본적으로 세팅이 되는 범..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/nzujN/btqCOety8bp/MHKJXna8sGT9WuJlP5JAN1/img.png)
저번에 IoC에 접근하는 방법으로 BeanFactory와 ApplicationContext가 있었다고 언급을 했었다. (ApplicationContext가 BeanFactory를 상속받는다). 개발을 하면서 직접 쓸 일은 아직 없는데 강의를 들을 때 계속 나와서 따로 기록을 해둔다. ApplicationContext로 IoC에 접근하고, getBean()으로 Ioc에 있는 Bean을 가지고 와서 출력해준다. 지금은 저게 IoC에 있는 bean인지 없는지 정도로만 사용하는데 더 뭔가 사용할 방법이 있지 않을까... 했는데 공식 문서를 보니 이름이나, 아이디, 부모 빼오는거 빼고는 특별한 점이 없다. https://docs.spring.io/spring-framework/docs/current/javadoc..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/YEjOJ/btqCBx8Gip5/XAlczqNvKX8bStQx0rtASk/img.png)
모든 포스팅에서 Bean 얘기를 하고 있는 느낌인데 오늘은 좀 심화된 Bean의 얘기를 할 것이다. Spring은 그냥 자바 객체를 쓰지 왜 Bean이라고 하는 별도의 개념을 또 만들어냈을까? 왜냐하면 의존성 주입(DI)가 하고 싶고, 스코프(객체의 활동 범위 정도라고 이해 했다)를 관리하고 싶었기 때문이다. Request를 물어오는 AController 객체가 하나면 충분하지 꼭 두 개, 세 개 여러 개 일 필요가 있을까? 그럴 필요 없다. 또 db와 연결을 하는 repository 객체는 하나 만드는데 꽤 비용이 든다. Spring은 이렇게 꼭 하나만 만들어도 되는 객체면 하나만 만들어서 쓰고 싶어 한다. 별 거 안 해도 무거운 자바에게는 필수적인 선택이었을 것이다. 그래서 단일 스코프로 작동하기 위..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ps7bD/btqCkRfQwb0/PBp2yb8DG2KoKyiR6IZqE1/img.png)
스프링이 제공해주는 가장 강력한 기능은 IoC, AOP, PSA라고 한다. 앞의 두 개는 들어본적이 있는데 PSA는 정말 처음 들어보는 개념이다. 강의의 마지막으로 PSA를 다루고 있어서 마지막 포스팅으로 PSA를 다루고자 한다. 이 포스팅이 끝나면 기초가 끝나고 아주 약간의 심화 과정인 'Spring 필수개념' 강좌를 들을 예정이다. PSA역시 약자이다. Portable Service Abstraction. Portable, Abstraction만 보고도 어떤 기능을 제공해주는지 아주 약간 감이 왔다. 코딩을 할 때 Portable과 Abstraction은 몇 번을 강조해도 모자라는 중요한 개념이자, 좋은 코드의 기준이 되는 개념이다. Portable은 코드를 떼어서 다른 부분에서 사용하여도 전혀 이상..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/br5BQo/btqCbTSbV4s/goPaBkxmRRwKyDDJMKiwT1/img.png)
오늘은 IoC 컨테이너와 Bean, DI(dependency injection)에 대해서 동시에 다루려고 한다. 조금 분량이 많아보이지만 사실 세 개는 겹치고 이어지는 개념이 많아 함께 다루는 게 더 효율적이라고 판단했다. 게다가 Inversion of Control 포스트에서도 IoC 컨테이너에 대해서 다루고 있기 때문에 IoC에 대한 설명이 더 필요하다면 그 포스트를 다시 봐도 좋을 것 같다. https://calgaryhomeless.tistory.com/2 (개념) Inversion of Control *얼마전부터 유튜브에 열려있는 백기선님의 '스프링 입문' 이라는 강좌를 듣기 시작했다. 몇몇 개념들은 정리를 해두면 좋을 것 같아서 블로그 포스팅을 하려고 한다. 다른 분들을 위해 강좌 링크를 밑에..