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