목록프로그래밍 (409)
쌓고 쌓다
웹 사이트를 만들며 PC와 모바일 환경에서 달리 화면을 보이게하길 원했다. 부트스트랩을 이용해서 반응형 웹을 만들고 있는데 이상한 부분이 있는 것이다. 보여질 컨텐츠가 1 2 3 4 순서라고 하자.화면이 작아졌다면 컨텐츠를 행을 늘려1 23 4이렇게 컨텐츠를 보여지거나1234이렇게 컨텐츠를 보여주는 것이다. 이상하게 다음과 같은 현상이 발생했다.PC에서는 웹 창 크기를 모서리를 드래그하여 조절할 수 있다.화면을 줄여서 컨텐츠의 순서가 1 2 3 4 순에서1 23 4 과 같이 잘 반응하여 변경되는데 모바일에서 접속해보면 화면이 다음과 같이 보이는 것이다.화면은 작아졌지만 PC에서 보는 화면 그대로 크기가 유지되어 있다. 알고보니 PC와 모바일의 뷰포트가 동일했던 것이였다.뷰포트? 우리가 볼 수 있는 시야의..
다음의 html을 작성했다. 회원가입 그냥 회원가입 버튼을 누르면 "/members/signup"으로 POST 요청을 보내는 html이다. 회원 가입 버튼을 눌러 POST 요청을 보냈더니 403 에러가 발생했다.. Security의 설정 빈을 다음과 같이 작성을 해서 분면 모든 요청을 허락했는데 말이다..@Configuration@EnableWebSecuritypublic class SecurityConfig { @Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(request -> request .anyRequest..
테스트 코드 작성중에 특정 인자와 함께 메서드가 1회 실행되었는지 확인하는 과정이 있었다.그런데 이상하게 인자가 잘 넘어갔는데 메서드가 테스트가 통과하지 않는 것이다. 동일한 객체인지 비교에 문제가 있어서 그런가 클래스에 @EqualsAndHashCode를 붙였더니테스트 코드가 통과된다. 그래서 equals와 hashCode에 대해 이해해보자. Object 클래스에 기본적으로 hashCode과 equals가 있다. 이건 어디다 쓰이는 것일까? @Testvoid test() { Car carA = new Car("12가3456"); Car carB = new Car("12가3456"); System.out.println("carA == carB : " + (carA == carB)); ..
docker-compose.yml를 다음과 같이 작성하고 사용하고 있었다... 보면 MYSQL_ROOT_PASSWORD를 작성해야한다.현재 깃허브에 docker-compose.yml도 올리면서 사용하고싶은데 비밀번호를 노출하고싶지 않다. 우연히 다른 코드들을 보았는데 ${}와 같이 따로 값들을 불러들이는 방법이 있다는걸 알았다. 도커 환경 변수 사용 방법은 다음과 같다. docker-compose.yml와 같은 위치에 ".env" 파일을 작성한다. ".env"에는 Key-Value 형식으로 값들을 작성하자. ".env"에서 불러온 값들로 어떤 값들이 채워졌는지는 다음과 같은 명령어로 확인할 수 있다.docker compose config 로컬에서 서버를 동작할때랑서버를 이미지 파일로 만들때 applic..
컨테이너에서 돌아가고 있는 서버에서 남긴 로그 파일들을 호스트에서 보관관리를 하고 싶었다.도커로 MySQL 이미지 파일을 volumes로 마운트를 해봤었다.https://non-stop.tistory.com/721 MySQL 데이터 백업 및 가져오기/Docker MySQL 볼륨 마운트MySQL의 데이터를 백업해보고 그 데이터를 Docker MySQL에 가져와보자. 그리고Docker 컨테이너를 통해 올린 DB 데이터를 Host에서 관리해보자. 먼저 Docker MySQL 볼륨을 마운트해보자.즉, Docker 컨테이너에non-stop.tistory.com 나는 volumes가 디비 관련해서 지원하는 옵션인줄 알았으나사실 도커 컨테이너와 호스트를 마운트하는 원리는 똑같았었다. 도커의 볼륨 설정이 마운트하는 설..
1) 체크, 언체크 예외먼저, 체크 예외와 언체크 예외 차이를 알아보자. Exception은 컴파일러가 체크하는 체크 예외이다.그러나 RuntimeException은 체크하지 않는다.RuntimeException의 자식 모두 언체크 예외이다. 어떤 차이를 가질까? 체크 예외- Repository, Service 코드에 throws 명시memberRepository 코드public Member findById(String memberId) throws SQLException { try { ... } catch (SQLException e) { throw e; }}만약 Repository에서 SQLException 체크 예외를 던진다면 throws로 던지는 예외를 명..
@Transactional을 붙이면 스프링이 AOP를 사용해서 트랜잭션을 편리하게 도와준다.스프링 AOP를 통해 프록시를 도입할 수 있다. 프록시를 붙이면 다음과 같이 동작한다.프록시를 사용해서 비즈니스 로직을 사용하는 서비스와 트랜잭션을 사용하는 객체를 분리할 수 있다. 스프링 부트를 사용하면 트랜잭션 AOP를 처리하기위한 빈들을 자동으로 등록해준다.트랜잭션 AOP는 @Transactional이 붙어있다면 트랜잭션 프록시를 적용해준다. 그러나 트랜잭션 AOP는 스프링 빈에 등록된 트랜잭션 매니저를 찾아서 사용한다.이제껏 나는 DataSource나 트랜잭션 매니저를 빈으로 등록한적이 없는데 어떻게 빈을 찾아쓴걸까? 원래라면 다음과 같이 빈을 직접 등록을 해줘야하지만@Bean DataSource dataS..
보통 애플리케이션 구조는 다음과 같이 3가지 계층으로 나눈다.서비스 계층에서는 비즈니스 로직을 담당하며 특정 기술에 의존하지 않고 순수 자바 코드로 작성한다.데이터 접근 계층에서는 JDBC, JPA와 같은 기술로 DB에 접근하는 코드를 작성한다. 서비스 계층에서 JDBC 트랜잭션을 사용하기위한 코드는 다음과 같다.public void somethingWork() { Connection connection = dataSource.getConnection(); try { connection.setAutoCommit(false); // 트랜잭션 시작 bizLogic(); // 비즈니스 로직 connection.commit(); } catch (Excepti..